LINUX.ORG.RU

И снова GtkTextView как делать подсветку... Какие мысли?


0

1

Доброго времени суток, интересуют идеи и мысли по поводу того, как делать подсветку синтаксиса в GtkTextView, я вижу его так: 1) Создаём тег 2) идём по буферу и ищем слова которые нужно подсветить, при это получается что идём(парсим по одной букве). Например так: берём два итератора, начинаем проверять слово, первый итератор ставим вначале слова, второй продвигаем вперёд, при этом проверяем слово, если совпало с нужным(if, else, while... etc) переходим к п.3 если нет, идём дальше. Таким образом эта пара итераторов будет постоянно передвигаться по тексту. 3) Применяем тег к куску буфера «выделенного» итераторами

Соответственно всё это дело оформляем в одну функцию, которая работает со всем текстом в буфере, её можно вызвать при загрузке из файла, а как быть при вводе данных, когда я сам взял и вбил служебное слово(тот же if) на каждое нажатие вызывать эту функцию, чтобы она снова весь буфер шелестила? Или лучше ловить позицию курсора и от неё плясать влево и вправо, смотря что за слово вбиваем(получается способом по п.2).

У кого какие мысли на этот счёт?

★★★★★
Ответ на: комментарий от CARS

Вряд ли подойдёт, я боюсь что с моим алгоритмом и так «тяжелая» функция получится, а тут наверно ещё хлеще... Во... переформулирую, как бы реализовали подсветку ВЫ? GtkSourceView не предлагать, понимаю что проще и баще, но в моём случае не камильфо :)

xterro ★★★★★
() автор топика
Ответ на: комментарий от CARS

>Регулярные выражения, не?

А потом удивляемся, что ж оно на большом файле то тормозит. Обвиняем xorg, месу, кернел, кде, гном и студентов-разработчиков, плюёмся слюной в монитор.

По сабжу - вполне можно будет действительно при вводе проверять данное конкретное слово (влево-вправо) и подсвечивать его.

Но более простой вариант - после ввода слова (т.е. по получению пробела) идти назад до начала и уже проверять слово (можно прям на ходу). По мне так по мере набора слова ему подсветка просто не нужна.

anonymous
()

Вам нужен инкрементальный парсинг. В общем случае я поступил бы примерно так.

У любого парсера есть какое-то состояние в каждой букве текста. Например, для регулярного выражения состоянием будет состояние ДКА. При начальном парсинге в каких-то точках можно сохранять состояние парсера. Например, на границах токенов. Затем при изменениях текста можно перезапускать парсер с самого ближнего сохраненного состояния, но чтобы парсер распарсил не весь остаток текста, а лишь до тех пор, пока его текущее состояние отличается от сохраненного состояния.

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

dmitry_vk ★★★
()
Ответ на: комментарий от xterro

не совсем так. скорее - закончил набирать более-менее связный кусок текста. насколько я помню - должен возникать, если введенный символ не подпадает под шаблон [:alnum:]

ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.