Идея подсветки текста, завершения кода и т. Д. В программировании - PullRequest
4 голосов
/ 05 октября 2010

Я хочу знать идею расширенных функций текстовых редакторов, таких как подсветка текста, автозавершение кода, автоматическое отступление и т. Д.

Чтобы прояснить мою идею, я представляю, что подсветка текста читает весь текст в строку, а затемрегулярное выражение заменяет ключевые слова на ключевые слова + цветовые коды и снова заменяет текст.Это выглядит логично, но было бы очень неэффективно делать это при каждом нажатии клавиши, например, если в вашем файле 4000 строк!Так что я хочу знать идею реализации такой вещи, например, в C # (любой другой язык тоже подойдет, но сейчас я экспериментирую с этим).

Ответы [ 3 ]

1 голос
/ 05 октября 2010

Старый, но все еще применимый ресурс для внутренних редакторов: Craft of Text Editing . В главе 7 непосредственно рассматривается вопрос о стратегии повторного отображения.

1 голос
/ 05 октября 2010

Чтобы выполнить «расширенную» подсветку синтаксиса, то есть подсветку, которая требует знания контекста, часто требуется синтаксический анализатор. Большинство синтаксических анализаторов построены на некоторой формальной грамматике , которая существует в различных вариантах: LL , LALR и LR являются общими.

Однако большинство парсеров работают с целыми файлами, что довольно неэффективно для редактирования текста, поэтому вместо этого мы обратимся к инкрементным парсерам . Инкрементальные синтаксические анализаторы используют знание языка и структуры того, что было ранее обработано, чтобы выполнить минимально возможный объем работы.

Вот несколько ссылок на инкрементный разбор:

1 голос
/ 05 октября 2010

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

Авто-завершение: Имея список возможных ключевых слов (которые могут быть отфильтрованы по контексту), вы можете быстро отбросить все, что не соответствует тому, что пользователь в данный момент печатает. В большинстве языков вы можете смело ограничивать себя одним «словом», так как пробел обычно недопустим в идентификаторе. Например, если я начну вводить «li», база данных автозаполнения может отбросить все, что не начинается с букв «l» и «i» (игнорируя регистр). Поскольку пользователь продолжает печатать, все больше и больше опций могут быть отброшены, пока не останется только один - или, по крайней мере, несколько. Поскольку вы просто смотрите по одному слову за раз, это действительно будет очень быстро.

Отступ: Быстрый и грязный подход, который (вроде бы) работает на C-подобных языках, состоит в том, чтобы иметь счетчик, который вы увеличиваете один раз для каждого '{', и уменьшаете один раз для каждого '}'. Когда вы нажимаете Enter, чтобы начать новую строку, уровень отступа равен counter * indentWidth, где indentWidth - это постоянное количество пробелов или табуляций для отступа. Это страдает серьезным недостатком, однако, рассмотрим следующее:

if(foo)
    bar(); // This line should be indented, but how does the computer know?

Чтобы справиться с этим, вы можете искать строки, заканчивающиеся на ')', а не точку с запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...