@ прибывающий шторм в основном прав. Для отображения вы начинаете с курсора и сканируете назад, пока не убедитесь, что не достигли верхней части экрана. Затем вы сканируете назад до конца строки, предполагая, что вы можете идентифицировать конец строки, сканируя назад. Теперь вы сканируете вперед, вычисляя и сохраняя начальные позиции строки экрана, пока не продвинетесь достаточно далеко. Наконец, вы выбираете строку, которую вы хотите начать отображать, и вы уходите.
Для простого текста это можно сделать на архаичном процессоре достаточно быстро, чтобы перерисовывать отображаемое в памяти видео при каждом нажатии клавиши. [Я изобрел эту технологию 30 лет назад]. Правильный способ сделать это - установить курсор в средней строке экрана.
Для фактического изменения файлов вы можете посмотреть, используя веревки Gnu. Веревка - это в основном связанный список буферов. Идея состоит в том, что все локальные изменения могут быть сделаны в одном небольшом буфере, иногда добавляя новый буфер, и иногда объединяя смежные буферы.
Я бы подумал объединить эту технологию с дифференциальным хранилищем: то, что делают все современные системы контроля версий. В принципе, имеет для использования такого вида редактирования на основе транзакций, если вы хотите реализовать функцию отменить .
Ключом к этому являются обратимые транзакции, т. Е. Та, которая содержит достаточно информации, чтобы применить ее в обратном направлении, чтобы отменить то, что она сделала при применении вперед. Основная транзакция редактора:
at pos p replace old with new
с обратным
at pos p replace new with old
Это обрабатывает вставку (старая пустая) и удаление (новая пустая), а также замена. Имея список транзакций, вы можете отменить внесенные изменения в строку, применив обратную сторону списка обратных транзакций.
Теперь вы используете старую концепцию контрольных точек: вы сохраняете довольно недавнее модифицированное изображение файла на месте вместе с некоторыми недавними транзакциями, которые еще не были применены. Для отображения вы применяете транзакции на лету. Чтобы отменить, вы просто выбрасываете некоторые транзакции. Время от времени вы фактически применяете транзакции, делая изображение «контрольной точки». Это ускоряет отображение за счет замедления отмены.
Наконец: чтобы переписать огромный последовательный текстовый файл, вы обычно переписываете весь текст, что ужасно. Если вы можете немного обмануть и разрешить произвольные 0 символов в тексте, и у вас есть доступ к системному администратору страниц виртуальной памяти и низкоуровневый доступ к диску, вы можете добиться гораздо большего, сохранив все неизмененные страницы текста и просто реорганизовав их: другими словами, идея канатов на диске.