Подтвердить что ты не робот

Теория текстового редактора

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

Помимо анализа исходного текста существующих текстовых редакторов, есть ли какая-либо книга или другой ресурс (например, академическая работа) по этой теме? Меня особенно интересует то, что учит тому, как обрабатывать память и как управлять вставкой текста (если у вас есть файл размером 100 МБ и вы хотите добавить char в положение x, вы можете просто memmove получить огромный текст блок...).

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Здесь есть отличный учебник, который охватывает множество актуальных тем в более современном контексте:

Другие ответы на этот вопрос охватывают буфер пробелов.

Другим современным освещением является описание AvalonEdit

и дополнительные детали из:

и в книге огромное количество деталей/контента (о SharpDevelop):

Ответ 4

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

Античный " Software Tools в Паскале" Kernighan и Plaugher" реализует редактор ed на языке, который не содержит ни настоящих строк, ни указателей. Он содержит большой обзор конструктивных соображений, лежащих в основе любого текстового редактора.

Ответ 5

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

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

Ответ 6

"Крафт редактирования текста" Крейга Финсета, основанный на его магистерской диссертации, охватывает эти темы. Это бесплатно в Интернете. OTOH он довольно старый и не упоминает некоторые идеи, такие как веревки, которые были менее практичными на крошечных компьютерах прошлых лет.

Ответ 7

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

Я знаю, что ответы на переполнение стека не должны быть ссылками, но это по-прежнему лучший источник информации, которую я когда-либо искал для запрашиваемой информации, и это слишком сложно обобщить в ответе здесь. Если ссылка устарела, найдите " Структуры данных для текстовых последовательностей" Чарльза Кроули из Университета Нью-Мексико.

Ответ 8

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

Ответ 9

Вот как это делают "профессионалы" в Microsoft:

MS Word использует структуру данных таблицы кусков. Возрастающий массив позиций символов поддерживается параллельно с массивом более крупных структур, которые содержат указатели либо в исходный файл (текст загружается при загрузке файла), либо в буфер только добавленных новых символов.

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

Если вы собираетесь создать простой неформатированный текстовый редактор в Windows, вы можете легко подклассифицировать элемент управления EDIT для добавления функций.

Ответ 10

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

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

Ответ 11

Хорошо, если вы знаете, что в целом у людей будет относительно мало точек вставки, вы можете держать массив указателей в исходном текстовом буфере, а когда пользователь попытается вставить его внутри, вы "разделите" буфер, создав другой указатель к остальной части буфера, делая первую длину указателя, чтобы она остановилась у точки вставки и добавила третий указатель для текста, который должен быть вставлен между ними, например:

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

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

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

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