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

С C # 4.0 отражение не требуется, поскольку DLR может вызывать его с использованием типов времени выполнения. Так как использование библиотеки DLR представляет собой боль динамически (вместо кода генерации компилятора C # для вас), open source framework Dynamitey (.net standard 1.5) дает вам простой кэшированный доступ во время выполнения те же вызовы, которые генерирует компилятор для вас.

var name = InvokeMemberName.Create;
Dynamic.InvokeMemberAction(this, name("GenericMethod", new[]{myType}));


var staticContext = InvokeContext.CreateStatic;
Dynamic.InvokeMemberAction(staticContext(typeof(Sample)), name("StaticMethod", new[]{myType}));

16
задан jfm3 1 October 2008 в 19:35
поделиться

11 ответов

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

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

7
ответ дан 30 November 2019 в 15:41
поделиться

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

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

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

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

14
ответ дан 30 November 2019 в 15:41
поделиться

"Банда Четыре" заказывает ( Шаблоны разработки ), имеет основанный на GUI текстовый редактор, поскольку это - основной источник примеров и является стоящей книгой для владения.

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

8
ответ дан 30 November 2019 в 15:41
поделиться

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

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

7
ответ дан 30 November 2019 в 15:41
поделиться

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

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

3
ответ дан 30 November 2019 в 15:41
поделиться

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

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

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

3
ответ дан 30 November 2019 в 15:41
поделиться

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

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

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

Выделяют код дисплея из текста, обрабатывающего код как можно больше. Центр Вашего кода будет жестким циклом что-то как:

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

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

2
ответ дан 30 November 2019 в 15:41
поделиться

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

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

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

1
ответ дан 30 November 2019 в 15:41
поделиться

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

1
ответ дан 30 November 2019 в 15:41
поделиться

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

-1
ответ дан 30 November 2019 в 15:41
поделиться

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

  1. Структуры данных для текстовых последовательностей описывает и экспериментально анализирует несколько структур данных, склоняясь к частичным таблицам в качестве структуры данных. выбора. Net.wisdom, однако, склоняется к использованию буферов пробелов, поскольку они более чем подходят для редактирования текста и их проще реализовать / отладить.
  2. «Мастерство редактирования текста» (www.finseth.com/craft/) - более старая работа , и обращается не только к структурам данных, но и ориентирован на редакторы в стиле Emacs; но концепции в целом полезны.
5
ответ дан 30 November 2019 в 15:41
поделиться
Другие вопросы по тегам:

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