Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > SynUniHighlighter и SynEdit > Подсветка парных скобок |
Автор: Kordub 21.2.2005, 10:16 |
В общем, поюзал Delphi 8 и обнаружил там классную новую подсветку - когда курсор расположен возле одной из парных скобок, обе скобки выделены голубым бэкграундом. Сильно упрощает чтение выражений со скобками. Реализовано ли это у вас а если нет, то можно ли сделать? |
Автор: Vitalik 22.2.2005, 23:55 | ||
Сделать можно. Вот пример кода:
Если есть вопросы по коду - задавай! ![]() P.S. Была небольшая опечатка в коде, только что исправил. |
Автор: Kordub 2.3.2005, 21:59 | ||
Не работает, так как не может найти парную скобку. Не работает почему-то GetMatchingBracketEx - все время возвращает нулевую позицию. Pos2 = (0,0) и обработчик события завершается по условию
|
Автор: Vitalik 3.3.2005, 23:01 |
Странно... А у тебя какая подсветка для SynEdit'а выбрана? |
Автор: Kordub 4.3.2005, 19:02 |
SynUniSyn |
Автор: Vitalik 4.3.2005, 20:59 |
В правилах этой подсветки есть список ключевых слов, в которых присутствуют скобки? Если нет - создай такое правило http://forum.sources.ru/smiles/Main/wink.gif |
Автор: Quadr0 10.5.2005, 21:27 |
... |
Автор: Vitalik 11.5.2005, 17:23 | ||
Quadr0, добро пожаловать к нам на огонёк! (я про форум) Очень рад новому участнику! ![]()
Эта процедура только найдёт парную скобку, а Kordub просил сделать подсветку парной скобки при попадании на неё курсора ![]() Но всё равно спасибо за попытку помочь! |
Автор: Quadr0 11.5.2005, 20:42 |
... |
Автор: Vitalik 12.5.2005, 00:36 | ||
А чем не устраивает приведённый мной код? ![]() А за демку - спасибо, не замечал её до селе... ![]() |
Автор: Coriolis 16.9.2005, 16:57 |
Нефигасебе здоровый код! Чтобы реализовать эту удобственность... В смысле это вообще в синэдите не предусмотрено... А ведь такая удобная весчь! Странно. |
Автор: Coriolis 16.9.2005, 17:13 |
Добавлю, что код Vitalik работает, а из демки - нет. |
Автор: ActioN 16.9.2005, 20:23 |
Quadr0, Vitalik, а у вас случайно нету готового рабочего кода на C++ Builder'e для реализации этой функции? |
Автор: miksayer 16.9.2005, 21:19 |
угу, у меня тот же вопрос. Не могу перевести |
Автор: Coriolis 28.10.2005, 18:44 |
Вот, вернулся к проекту, возникла трябла. В ключевых словах у меня прописаны операторы. Существуют и переменные с именем оператора. Поэтому возникает ситуация: переменная подсвечивается как оператор. Чтобы избежать этого я начал извращаться: в ключевых словах к операторам добавляю символы, например Операторы: B S M B: M: S: Вот, и ещё создал набор KeyWords, с названием NOToperators, и цветом как обычные символы: B= B, B) M= M, M) S= S, S) т.е. операторы не могут встречаться в тексте рядом с такими символами. Но вот проблема: код для подсветки парных скобок, который привёл Vitalic, не видет такой скобки. Не могу понять - почему. пример: s a=$$abc^abc(1,2,s) Первую скобку видит, а последнюю - нет. Игнорирует. |
Автор: Vitalik 29.10.2005, 21:02 | ||||||||
Coriolis, извини, что не ответил вчера. Сейчас немного не хватает времени... Плюс я немного приболел ![]()
А что это за язык такой, если не секрет? ![]() Можешь также прислать мне свою подсветку для него? Пиши на highlighters[at]gmail.com ![]()
Гм... А по каким правилам определяется является слово переменной или оператором?..
А это всё из-за того, что в приведённом алгоритме скобки будут подсвечиваются только если они в тексте являются отдельными лексемами... (или что-то вроде того)
В принципе можешь удалить эти строчки и проверку... Но тогда получай Bracket1 другим способом... |
Автор: Coriolis 29.10.2005, 21:45 | ||||||
Да брось - не за что. Выздоравливай. ![]()
Язык - M, процедурный, идёт вместе с БД. Интерпретируется, программы хранятся на сервере. Чё ещё сказать? О! Cashe - это потомок эМа, просто прикрутили (как кто-то сказал - за уши) объекты. А так - cashe тот же эМ. Конкретно - для СУБД MSM (Micronetic Systems M кажется). а чем переменные отличаются - это от контекста зависит. Для экономии памяти принято сокращать операторы до одной буквы, напр оператор SET (аналог в васике - LET) - s, GOTO - g, DO (аналог в вdвасике GOSUB) - d. вот, напр s s=13 переменной s присваевается значение 13, т.е. SET s=13 Поэтому если перед и после s стоит пробел - это оператор. Если после/перед s запятая или скобка - это переменная (например её передали как параметр) Вот пример кода: ; функция find - чего-то там ищет в файле find(fstr) n str,findfl s findfl="" f d q:((findfl)!($zc)) .s str=$$read() .q:str="" .;s str=$zzup($zzdsp(str,5)) .s:str[fstr findfl=1 q:$zc "" q str (табуляция в начале строки, кста -обязат)
Не понял - куда слать? |
Автор: Vitalik 29.10.2005, 21:56 | ||||||
Ничего себе ![]() ![]() По-моему читабельность программы от этого сильно падает ![]()
Это там надо считать, что вместо точек стоит табуляция? ![]()
Шли на мыло: highlighters (собачка) gmail.com ![]() Или можешь прикрепить здесь к своему сообщению (этот вариант более желателен) ![]() |
Автор: Coriolis 30.10.2005, 19:43 | ||||||
Ага, я тоже так подумал - когда знакомился с языком. Но это позволяет уменьшить память, т.к. текст интерпретируется.
Да не, быстро привыкаешь и без проблем читаешь исходняк, поверь мне. ![]()
Нет-нет, точки - это часть синтаксиса, это аналок {} в сях или begin end в паскале - уровень обозначают. А табуляция - именно #9. Сейчас прикреплю, но учти - сырой файл, т.к. "в процессе". Тяяяяк. Не вижу кнопки прикрепит файл. Мож я маленький есчё? Тада шлю на мыло. |
Автор: GORI 31.10.2005, 09:44 |
Если использовать SynPHPSyn1 то все работает, а если SynUni и подгрузить лайтер для PHP то нет. В чем причина? |
Автор: Vitalik 31.10.2005, 17:28 | ||||||||
Эта кнопка должна появляться после предварительного просмотра сообщения ![]()
Значится так... Coriolis и GORI, можете модифицировать код следующим образом:
Теперь скобки будут подсвечиваться абсолютно везде, где будут найдены ![]() Потому как теперь мы будет отталкиваться не от найденной лексемы (Token), а от реальных симоволов в тексте (Lines) ![]() Добавлено @ 17:32
Да, письмо получил ![]() Когда подсветка будет готова можешь выложить её на сайте http://www.unihighlighter.com/index.php?download=highlighters ![]() |
Автор: Coriolis 31.10.2005, 19:20 |
Ой, не в ту тему написал! сорри. |
Автор: GORI 1.11.2005, 00:18 |
Блин ![]() ![]() ![]() ![]() |
Автор: Vitalik 1.11.2005, 01:04 |
Заказывали примерчик? ![]() |
Автор: Vitalik 1.11.2005, 01:07 |
А вот вместе с EXE ![]() (жаль нельзя к одному сообщению несколько файлов прикрепить) |
Автор: Coriolis 1.11.2005, 12:43 |
Ок, спасибо за пример. Я его только поправил - чтобы не светилась скобка, которая находится за перед курсором. Тут мне Snowy указал на глюк: алгоритм подсветки НЕ игнорирует скобки внутри кавычек. Чего-то не пойму, как это профиксить... |
Автор: Vitalik 2.11.2005, 15:44 | ||
Гм... Так сходу ничего и получается... ![]() Есть как минимум два пути: 1. Переписать метод SynEdit.GetMatchingBracketEx под свои нужды. Например, вставить нужные фильтры. Как то, игнорирование скобок во всех диапазонах или в диапазонах с определёнными именнами или еще что-нить ![]() 2. Сделать возможность в компоненте задавать свойство StringAttribute (которое объявлено только для чтения у потомка всех подсветок TCustomHighlighter). Просто в реализации метода SynEdit.GetMatchingBracketEx уже есть фильтрация диапазонов строки и комментария. Нужно лишь реализовать возможность в нашем компоненте задавать какие именно диапазоны (а точнее их атрибуты) являются диапазонами "строки" и "комментария" ![]() |
Автор: zvyagaaa 1.6.2009, 05:17 |
а можно ли как-то сделать, чтобы парные скобки выделялись бы еще и разными цветами.? Как в экселе в строке формул? поясню, к примеру (((1/2)*2)-2) |
Автор: Coriolis 2.6.2012, 23:12 |
Кстати да, крутая штука. zvyagaaa, ты если реализовал - поделись пожалуйста) |