|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||
Работа с текстовым редактором Scintilla16.11.2022, 21:30. Показов 10132. Ответов 99
Метки нет (Все метки)
Доброго времени суток ! Тружусь над небольшой программкой, в которой у меня будет редактор кода на основе "Scintilla". Столкнулся с такой задачкой: нужно, чтобы при нахождении ключевого слова, происходила его замена. По типу как в пурике - если пользователь написал ключевое слово в нижнем регистре, редактор его заменил на то, как эти ключевые слова хранятся в программе. К примеру, пользователь прописал "for" -> редактор сменил на "For". При этом, пурик, как известно, подсветку производит непосредственно как только обнаруживает ключевое слово, а замену делает при наборе следующего символа. При этом, символ должен быть либо пробел, либо скобка, либо переход на новую строку и т.п.
Выкладываю свой самый сокращенный вариант для примера. В нём зарезервировано только одно ключевое слово "For", ну этого достаточно для теста. Тут я пытаюсь добиться желаемого, но как-то некорректно это происходит. В строчках 89, 90 как раз пытаюсь прописать эту замену, но почему-то она не работает как нужно. Подскажите, пожалуйста, в чём ошибка ? Как только не пытался экспериментировать, никак не могу добиться желаемого. Документацию по Scintilla уже раз 40 пересматривал, изучал, но там тоже не так просто разобраться. Она таким тяжелым языком написана, а более понятной и доступной нигде не найти. В общем, вот мой пример поиска решения, дальше которого я никак не могу продвинуться. Помогите, пожалуйста, если есть кто-то компетентный.
0
|
||||||
| 16.11.2022, 21:30 | |
|
Ответы с готовыми решениями:
99
Работа с текстовым редактором Работа с текстовым редактором Помогите с текстовым редактором! |
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||
| 28.11.2022, 10:21 [ТС] | ||||||
|
Я понял. Скорее всего, регулярными выражениями здесь не получится окрашивать фразы, если только отдельные символы, заключённые в одной регулярке. Одно выражение, состоящее из нескольких символов в разные цвета он не окрасит. А раз он этого не может сделать, то и не выполняется SCI_SETSTYLING, а следовательно непрерывно отправляются запросы на перерисовку. Насколько я понял, тут суть следующая - ввёл символ - вся строка начинает от первого символа до позиции Pos посимвольно окрашиваться пока не дойдёт до Pos. Если все перекрашивания удачны, запросы на раскрашивание прекращаются. Если какой-то символ не удалось покрасить - он снова отправляет запрос на перекрашивание. И может даже зависнуть. После каждого внесения изменений в строку, начинается посимвольная перекраска до позиции Pos
Добавлено через 10 минут Если, к примеру, надо несколько символов сделать одним стилем, то только эта группа окрасится в один стиль, где начало и конец окраски задаёт
0
|
||||||
| 28.11.2022, 10:26 | |
|
Я тоже понял, что событие требует покраски хотя бы одного символа, ведь он же введён, то есть после каждого уведомления должен сработать SCI_SETSTYLING не меньше одного раза, который выдаст флаг, что операция покраски завершена, а пока флаг не переключился он так и будет слать уведомление о перекрашивании.
Ты ошибаешься, несмотря на то что регвыр красит поверх при умении можно сделать нормальное подкрашивание. У меня даже код PureBasic подкрашивается. Я уже сделал регвыр наверно для 7 файлов.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||
| 28.11.2022, 10:37 [ТС] | ||
- он это сделает, и будет двигаться дальше. Главное, чтоб неокрашенных символов не оставалось позади.
0
|
||
| 28.11.2022, 11:04 | |
|
antro735, ты решаешь задачу не покраски, а соответствия регистра для ключевых слов, для покраски алгоритм можно сделать совершенно иной. Получил начало и конец строки и прогнал поиск по строке ключевых слов с помощью регулярных выражений или обычного поиска "целого слова", у поиска есть флаг "целое слово".
Не все вещи можно задать ключевыми словами, например как ты задашь поиск файлового пути, GUID, шестнадцатеричных чисел, констант в PureBasic, которые определяются префиксом # и т.д. Хотя частично можно писать алгоритмы аналогичные движку регулярных выражений, но это изобретать велосипед, если хочешь сделать поддержку регвыр для пользователей, то если в программе уже будет встроен движок рег.выр, то почему бы не воспользоваться и сделать поддержку подсветки с помощью рег.выр. для пользователей как это сделано в AkelPad.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 28.11.2022, 11:15 [ТС] | |
|
AZJIO, Тут тоже согласен, алгоритм раскраски можно изменить. Но если он выполнился без ошибок, SCI_STARTSTYLING перестаёт отправлять запросы на стилизацию, и всё будет ровно
0
|
|
|
|
||||||
| 28.11.2022, 11:57 | ||||||
Из-за него эти события.
0
|
||||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||||||||
| 28.11.2022, 12:38 [ТС] | ||||||||||||
|
Залил себе. Открыл, помотрел. Самое интересное знаешь в чём
Редактор, над которым сейчас тружусь я, тоже с практически такой же тёмной темой Правда, я ещё предоставил возможность переключаться темам - светлая и тёмная. Ты его чисто для себя писал ? для своих нужд и удобства ?Добавлено через 10 минут
Добавлено через 24 минуты И ещё... Я сейчас приступил к индикаторной подсветке выделенного слова в тексте. Ну, как в пурике - выделил слово, и по всему тексту где оно встречается, оно подсвечено индикатором. Но тут столкнулся с непонятным явлением. Не знаю, это или у меня пурик глючит, или что-то другое. В общем, мне нужно добавить символ "$" в стандартный набор символов слова. Там это делается через указатель на эту строку. Так вот, если у меня строка короткая, то всё нормально. Например:
"Невозможен доступ к памяти(ошибка чтения по адресу 548.......)" Вот тут уже выдаёт постоянно эту ошибку:
0
|
||||||||||||
| 28.11.2022, 12:56 | |
|
locm, курсор и в ваших примерах мигает, но уведомление то не приходит. тут мы достоверно установили причину, нужна отработка SCI_SETSTYLING. Я выше писал, если текст подкрасился то уведомления не шлются, а если я ввёл русские буквы, которые не подвергаются подкрашиванию и не срабатывает SCI_SETSTYLING, то идут уведомление SCN_STYLENEEDED.
antro735, для себя и для всех. Если я выкладываю, значит любой может пользоваться.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 28.11.2022, 13:26 [ТС] | |
|
AZJIO, так-то неплохо. Нумерацию строк не стал делать ? Просто как блокнот ? Или дорабатывать будешь ?
0
|
|
| 28.11.2022, 13:52 | |
|
antro735, так там ещё дорабатывать и дорабатывать. Сегодня добавил распознавание кодировки UTF-8 без BOM, нагуглил код на оф.форуме и уже добавил эту функцию в свою справку. На днях затесалась проблема со шрифтом вот сейчас исправил, сравнил исходник 7 и 8 между которыми появилась проблема и вычленил проблему, как на зло я ещё делал форматирование отступов и разница была почти в каждой строке, тупо блоками в Meld возвращал 8 к 7 и запускал, так что перекачивай, там уже новое исправленное.
А вообще если раньше я как то придерживался темы выясняя поведение движка то теперь мы отошли от темы, лучше на каждый новый вопрос и обсуждение моей проги создать новую тему.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 28.11.2022, 15:44 [ТС] | |
|
Нет, AZJIO, там в посте ссылка есть на скачивание, но самого файла нет, только надпись "File was deleted by user."
0
|
|
|
|
||||||||||||||||||||||
| 28.11.2022, 17:30 | ||||||||||||||||||||||
1
|
||||||||||||||||||||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||
| 28.11.2022, 18:49 [ТС] | ||
|
Благодарю, locm ! Не перестаю удивляться - это же какой объём информации и знаний должно находиться в голове, чтобы так хорошо ориентироваться и знать столько тонкостей !!!? Включил Purifier. Сейчас в протоколе ошибок фиксирует ошибку по-другому, пишет: "overflow in a dynamically allocated memory block". То есть, "переполнение в динамически выделяемом блоке памяти", вместо "ошибка чтения по адресу .....", а это уже конкретная причина сбоя исполнения программы. Чтобы точно убедиться, что я правильно понял Вашу подсказку, Purifier так и работает и я верно сделал настройку ?
Добавлено через 13 минут
SCI_SETWORDCHARS(<unused> , const char *characters) Это сообщение определяет, какие символы являются членами категории слов. Перед обработкой этой функции категории символов устанавливаются значения по умолчанию. Например, если вы не разрешаете '_' в вашем наборе символов использовать: SCI_SETWORDCHARS (0, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM NOPQRSTUVWXYZ0123456789") ; Вот тут я ещё не знаю, const char *characters - как правильно понимать ? Имеется ввиду заполненная область памяти, или достаточно указателя на строку ?
0
|
||
|
|
||||||||
| 28.11.2022, 19:39 | ||||||||
|
По сути это
0
|
||||||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||
| 28.11.2022, 19:59 [ТС] | ||
0
|
||
| 29.11.2022, 11:24 | |
|
Посмотри ссылки плаги Notepad++, код-архив (в последней папке есть Scintilla и ещё найди там автора eddy в его папке примеры Scintilla и ссылки на оригиналы)
1
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 29.11.2022, 15:42 [ТС] | |
|
Благодарю, AZJIO ! Я тем временем с подсветкой одинаковых слов в тексте закончил, за автозавершение взялся.
0
|
|
| 30.11.2022, 03:01 | |
|
antro735, я не любитель нативного автозавершения, если функционал будет выглядеть как вставка конструкций кода, то это можно принять, иначе делать собственный вариант, погугли "AutoCompletionIDE"
На счёт My_Notepad_Sci ссылка на яндекс всегда исправная, а на upload.ee там нет обновлений, а каждый раз на всех ресурсах обновлять ссылку и перезаливать немного напрягает. На яндекс.диск просто кидаешь файл в окно браузера и файл обновляется, а ссылка остаётся та же. Кстати на оф.форуме примеров Scintilla полно, но они старые с использованием WinAPI для создания окна, когда видимо Scintilla ещё не была внутренним гаджетом, но можно подсмотреть концепцию. Я искал работу с нативными подсветками используя #SCI_SETLEXER и выяснил что Scintilla может быть скомпилирована с лексерами и без, видимо вариант в PureBasic скомпилирован без лексеров, а также без поддержки SCFIND_CXX11REGEX, так как я не смог использовать более продвинутые рег.выр. взамен нативного урезанного.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||
| 30.11.2022, 04:50 [ТС] | ||
|
AZJIO, не знал, что можно через яндекс так обновлять файлы. Не знаю, как это работает, ну, да, ладно, не до этого сейчас. Обновил My_Notepad_Sci.
ScintillaSendMessage(0, #SCI_AUTOCSETMAXHEIGHT, 600) просто посмотреть как он с ними будет справляться. И тут начинаются нереально жуткие тормоза - что у меня, что в My_Notepad_Sci. Однако, этого не наблюдается в том редакторе, пример которого у меня есть. И написан он тоже на PureBasic. Никаких тормозов. Правда, там почти 2500 строк кода, много разных модулей. Моего уровня пока не хватает, чтоб разобраться в том исходнике. Что-то я там понимаю, но далеко не всё. Могу выложить сюда исходник, только, не знаю, можно ли такой длинный код здесь выкладывать ? Не забанят ? Добавлено через 5 минут В My_Notepad_Sc начинаются тормоза когда включаешь его в режим подсветки pb
0
|
||
| 30.11.2022, 04:50 | |
|
Помощь с текстовым редактором Ввод и вывод массива с текстовым редактором Обработка больших файлов текстовым редактором Сценарий PowerShell для работы с текстовым редактором Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|