|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||
Работа с текстовым редактором Scintilla16.11.2022, 21:30. Показов 9315. Ответов 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 для работы с текстовым редактором Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|