|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||
Работа с текстовым редактором Scintilla16.11.2022, 21:30. Показов 8630. Ответов 99
Метки нет (Все метки)
Доброго времени суток ! Тружусь над небольшой программкой, в которой у меня будет редактор кода на основе "Scintilla". Столкнулся с такой задачкой: нужно, чтобы при нахождении ключевого слова, происходила его замена. По типу как в пурике - если пользователь написал ключевое слово в нижнем регистре, редактор его заменил на то, как эти ключевые слова хранятся в программе. К примеру, пользователь прописал "for" -> редактор сменил на "For". При этом, пурик, как известно, подсветку производит непосредственно как только обнаруживает ключевое слово, а замену делает при наборе следующего символа. При этом, символ должен быть либо пробел, либо скобка, либо переход на новую строку и т.п.
Выкладываю свой самый сокращенный вариант для примера. В нём зарезервировано только одно ключевое слово "For", ну этого достаточно для теста. Тут я пытаюсь добиться желаемого, но как-то некорректно это происходит. В строчках 89, 90 как раз пытаюсь прописать эту замену, но почему-то она не работает как нужно. Подскажите, пожалуйста, в чём ошибка ? Как только не пытался экспериментировать, никак не могу добиться желаемого. Документацию по Scintilla уже раз 40 пересматривал, изучал, но там тоже не так просто разобраться. Она таким тяжелым языком написана, а более понятной и доступной нигде не найти. В общем, вот мой пример поиска решения, дальше которого я никак не могу продвинуться. Помогите, пожалуйста, если есть кто-то компетентный.
0
|
||||||
| 16.11.2022, 21:30 | |
|
Ответы с готовыми решениями:
99
Работа с текстовым редактором Работа с текстовым редактором Помогите с текстовым редактором! |
|
|
|
| 16.11.2022, 22:35 | |
|
Делал подобное, но давно и уже не помню подробностей.
Если не ошибаюсь сделал через поиск/замену https://www.scintilla.org/Scin... #Searching
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 16.11.2022, 23:02 [ТС] | |
|
Я в курсе этой документации, и роюсь в ней уже довольно долгое время, но, то ли она сама так коряво объясняет назначение и принципы этих команд, то ли я такой тупой - разобраться в ней не так-то просто. Приходится фактически методом тыка всё делать. Частично, конечно, она даёт представление, но всерьёз в ней разобраться - ещё та задачка...
Добавлено через 11 минут Просто сделать подсветку ключевых слов как есть без замены, подсветку констант, строк, заключенных в двойные кавычки и прочие подсветки - эта задача освоена и решена, а, вот не только подсветка, но ещё и замена (в данном случае ключевых слов) в моей попытке решения этого вопроса, нарушает всю корректность работы редактора.
0
|
|
|
|
||||||
| 17.11.2022, 01:31 | ||||||
|
Нашел исходник программы о которой писал. Участок кода заменяющий ключевые слова.
0
|
||||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||
| 17.11.2022, 02:50 [ТС] | ||||||
|
Попробую привязать. А что здесь подразумевается под аргументом PosText ?
Добавлено через 39 минут Просмотрел процедуру. В принципе, полностью она и не обязательна в данном случае. В ней самое нужное в 34, 35, 36 строчках. Я и так тоже уже пытался делать. Результат тот же. Вот, закомментировал свои строки, и заменил их на строки из процедуры. Результат одинаковый:
0
|
||||||
|
|
||||||
| 17.11.2022, 14:29 | ||||||
|
Доработал один из давно написанных кодов. Изменяет for.
1
|
||||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 17.11.2022, 16:34 [ТС] | |
|
Да ! Делает так как нужно !
Сейчас сяду вникать, разбираться в чём причина некорректности моего варианта. Или, если не затруднит, можете подсказать в чём была моя недоработка ? Или хотя бы дать намёк...Добавлено через 1 час 28 минут Кстати, я уже рассматривал с какого-то ресурса этот вариант кода. В нём почему-то строка 201, которая должна отображаться в окне, не отображается в нём полностью, а только первый символ - точка с запятой. Это только у меня так, или нет ?
0
|
|
|
|
||||||
| 17.11.2022, 16:47 | ||||||
|
Код был написан давно.
Нужно заменить 201 строку на
0
|
||||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 18.11.2022, 13:27 [ТС] | |
|
Я что-то никак не могу понять, что за позицию возвращает первое поле структуры SCNotification\position ? Когда набираешь текст в редакторе, он возвращает разные данные. По мере изменений в документе, в одном и том же месте может показывать разные значения, и я не могу понять, что за значение он возвращает ? Если бы просто позиция каретки в документе, то она в одном и том же месте была одинаковой, а тут идёт возврат разных значений. ???
0
|
|
|
|
||||
| 18.11.2022, 15:54 | ||||
0
|
||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||
| 18.11.2022, 17:55 [ТС] | ||||||
|
Видимо, из-за недостатка знания других языков, к примеру, того же С++, я не могу до конца разобраться в этой документации по Scintilla. Там приводятся примеры на других языках, но мне эти примеры не совсем понятны.
То есть, после стилизации некоторых символов, значение, возвращаемое SCNotification\position каким-то образом изменяется ? Вот, конкретно в наших предыдущих кодах редактора есть такая строчка:
Я и хочу разобраться, как же всё-таки понять, какое значение вернёт SCNotification\position в тот момент, когда нужно использовать это значение. Добавлено через 19 минут Потому что pos в наших предыдущих примерах кодов, как раз и есть значение SCNotification\position
0
|
||||||
|
|
||||
| 18.11.2022, 18:06 | ||||
|
Для других сообщений в SCNotification\position будет другая информация.
1
|
||||
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 18.11.2022, 21:52 [ТС] | |
|
Благодарю, locm !!!
Сейчас уже более понятно ! Теперь сяду экспериментировать на основе этой информации.Добавлено через 3 часа 33 минуты И всё же, правильно ли я понимаю, что после ввода какого-либо символа в редакторе, в контейнере #SCN_STYLENEEDED будет находиться значение SCNotification\position равное позиции последнего символа с тем лексером, в котором на текущий момент находится каретка ?
0
|
|
|
|
|
| 19.11.2022, 00:37 | |
|
Нужно ориентироваться на документацию https://www.scintilla.org/Scin... TYLENEEDED
Проверить можно сравнивая текущую позицию со значением в SCNotification\position.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
||||||
| 25.11.2022, 06:31 [ТС] | ||||||
|
Уже почти неделю бьюсь и никак не могу понять, где ошибка. Уже какие только эксперименты и тесты не проводил, никак не могу понять, где собака зарыта... В общем, набираю я , к примеру, какое-то ключевое слово (возьмём тот же "for") все буквы в нижнем регистре, если набирать его с самого начала первой строки, как только оно будет набрано, всё нормально - оно подсветится. Дальше, допустим, я ввожу пробел (для экспериментирования пока использую пробел, доработки уже потом), в этот момент слово должно поменять вид с "for" на "For". Вид меняется, но при этом фон подсвечиваемой строки приобретает какой-то разрыв.
Следующий эксперимент - набираю сначала, допустим, 2-3 пробела, и набираю "for". Тут пока всё нормально, слово подсвечивается, но как только следом ввожу пробел или удаляю последнюю букву "r" снова возникает разрыв в подсветке активной строки. А если после только что набранного "for" попытаться перейти на следующую строку - вообще жуть. Но самое интересное во всём этом, что если сначала набрать пробел, а перед этим пробелом набрать "for", то всё отрабатывает отлично. Оно по сути так и нужно. Если после ключевого слова стоит пробел или любой другой символ с другим лексером, то "for" тут же отобразится как "For". Как в редакторе пурика, только в пурике если набираешь "for", даже если после него есть пробел, или другой символ, не относящийся к символам слова, пока не введёшь какой-то символ после только что введённого "for", он не изменится на "For", а тут он сразу понимает, как нужно отобразить ключевое слово. Ну, так, вот, мне непонятно, почему ? Почему после того как мы набираем "for", а затем пробел, он начинает бунтовать ? Ведь по сути, при обработке строки, он сначала обнаружит ключевое слово, а потом и введённый нами пробел, как и в вышеупомянутом случае. По алгоритму вроде бы всё верно. Хотя... есть у меня один непонятный момент. Строка 208, отвечающая за начальную подсветку обнаруженного ключевого слова, должна начать исполняться когда изменился лексер, но в момент набора символов слова лексер не изменяется. С какого перепугу он начинает подсвечивать ключевое слово, если смена лексера ещё не произошла ? Друзья, помогите, пожалуйста, разобраться и понять, что не так, если, конечно, не затруднит ? А самое главное - почему происходит такая непонятка ? Складывается такое впечатление, что первый символ в документе не совсем первый, как будто перед ним ещё какое-то пространство как минимум в один символ. Может быть, я ошибаюсь. Пробовал отследить позицию каретки при вводе первого символа, а он выдаёт две позиции. Если отслеживать код вводимого символа, то тоже почему-то какой-то нулевой символ всегда присутствует. Я понимаю, что строки заканчиваются терминальным нулём, но если это здесь даёт такой побочный эффект, как с ним справиться ? Кстати, при появлении ключевого слова добавил, чтоб оно реагировало на курсор мыши - оно подчеркивается. Удобно для отслеживания количества символов, которые Scintilla принимает за ключевые слова. Если что-то не так, сразу будет видно какие лишние символы принимает за символы ключевого слова. Вот сам экспериментальный код:
0
|
||||||
| 25.11.2022, 08:18 | |
|
antro735, на всякий случай справка по Scintilla на русском переведённая в гугле и обработанная скриптами, чтобы была подсветка и функции являлись ссылками. Пытался осмысленно переводить но забросил. Понять не сложно, никакой там не другой язык, там вообще нет привязки к языку. Есть функция, в скобках перечислены параметры, стрелка после скобок показывает в каком формате будет возвращено, например "int" и таких там большинство, то есть целое число. Параметры в скобках тоже имеют тип и назначение, например "position length" тип "position" то есть положительное число, и длинна или например "char *text", char это тип символы, *text это указатель. Причём по контексту везде написано если не указана длина строки, то строка нуль-терминированная, то есть движок будет искать 00 что будет определять конец строки, если же указана длина, что строка будет не нуль-терминированная. Где-то сказано что надо добавить 1 байт к длине строки чтобы движок завершил текст нулём, который определяет конец строки. В большинстве случаев везде тип int. Также в начале справки идёт описание типов, таблица с 11 типов bool, int, position, line и т.д.
Но я делал 3 года назад, может что-либо обновилось уже, так что можно заглядывать в англоязычную для уточнения. И в комплекте скрипт для обработки, можно скачать новую и выполнить обработку.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 25.11.2022, 09:53 [ТС] | |
|
AZJIO, У меня эти все документации по Scintilla есть давно. Кроме них фактически другой документации и нет никакой. Ну, хорошо, 3 года назад ты пытался работать с Scintilla, а каков результат ? Сделал что нужно было ? Выложи свою наработку. Отправить читать литературу большого ума не надо. Так и я всем могу помогать и подсказывать: "Вот книжки - возьми почитай".
Если ты о том, чтобы просто разукрасить текст - с этим я в общем-то разобрался, а, вот, с заменой в нужном месте - тут немного сложно для меня оказалось. Может быть, я совсем деревянный, но документацию вдоль и поперёк уже жую насколько понятия моего хватает. Да, огромным багажом знаний и опыта не похвастаюсь, к тому же, там примеры приводятся в основном на, если не ошибаюсь, С++. Я этот язык ещё не осваивал, и мне не так просто понять те примеры, которые там приводятся, поэтому и обращаюсь сюда за помощью на форум. Я нуждаюсь в помощи и подсказках более опытных ребят. И, самое главное - разобрать причину моих неудачных попыток добиться желаемого результата. Что я неправильно делаю. Я и справ, и слева, и спереди, и сзади, и сверху, и снизу экспериментирую не без помощи той же документации, найти нужное решение. Что-то уже освоено, достигнуто и сделано, а сейчас топчусь на одном месте как головой пО столу, ну, хоть ты тресни, не могу въехать что не так я делаю. Кроме как к более опытным парням больше не знаю к кому обратиться. Нет, можно, конечно, ещё неделю - две - месяц, а то и пол-года потратить на поиски, эксперименты, изучение дополнительной литературы, ЯП, и т.д. Время - самый дорогой ресурс. Всё можно вернуть, а время - нет. Так почему не обратиться к старшим товарищам, увидеть и узнать более грамотные и более профессиональные пути решения, научиться у них чему-то за более короткое время ? Добавлено через 21 минуту Мне ведь нужно даже не то, чтобы мне прислали готовое решение, а просто понять, в чём моя ошибка. Если я пойму и разберусь, я сам всё допишу и сделаю. Главное - понять причину кривого результата. В принципе, я близко подобрался к достижению желаемого. Возможно, тут какая-то мелочь, которую я никак не могу разглядеть или понять. Нуждаюсь просто в доступном объяснении, подсказке, намёке хотя бы. Добавлено через 8 минут Пусть, допустим, ты уже нашёл причину и решение, и у тебя всё работает, просто, помоги понять что у меня не так. Может быть, там совсем мелочь, а я её не вижу, или не знаю о ней.
0
|
|
|
1 / 1 / 0
Регистрация: 28.07.2018
Сообщений: 124
|
|
| 25.11.2022, 10:04 [ТС] | |
|
AZJIO, я выше писал, что я не всё понимаю в этой документации. Если бы я там всё понимал, и выучил наизусть, как ты считаешь, я бы сюда не написал, и не просил помочь.
0
|
|
|
|
||||||
| 25.11.2022, 14:11 | ||||||
|
antro735, почему замена регистра ключевого слова выполняется в следующем вызове процедуры когда все позиции отличаются?
Нашли ключевое слово и сразу заменяйте его.
0
|
||||||
| 25.11.2022, 14:11 | |
|
Помогаю со студенческими работами здесь
20
Помощь с текстовым редактором Ввод и вывод массива с текстовым редактором Обработка больших файлов текстовым редактором Сценарий PowerShell для работы с текстовым редактором Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|