OberonCore https://forum.oberoncore.ru/ |
|
Предпосылки для подсветки скобок, автокомплита, и прочего. https://forum.oberoncore.ru/viewtopic.php?f=47&t=4452 |
Страница 1 из 3 |
Автор: | Пётр Кушнир [ Вторник, 20 Август, 2013 23:54 ] |
Заголовок сообщения: | Предпосылки для подсветки скобок, автокомплита, и прочего. |
В качестве зарядки для ума сегодня рассмотрели теоретическую возможность оформления подсветки скобок (а так же автокомплита) посредством встраивания в текстовый документ специального якоря, внутри которого могла бы происходить обработка сигналов, приходящих в родительский контейнер, и соответствующие бескровные изменения на лету. Таким образом, посредством встраивания вьюшки может происходить уточнение назначения текстового документа, введение новой функциональности и всё тому подобное. Как бы, бб даёт нам тексты вообще, и чисто случайно оказывается, что рядом лежит компилятор, а теперь мы встраиваем девелоперские якоря и уже точно фиксируем то, что этот текст является исходником. Якоря в тексте - фича сезона "Весна-лето 2013" По ходу исследования столкнулись с уже известной проблемой, когда модельные сообщения проходят только по дереву фреймов, а в невидимые отображения не долетают. То есть, управляющий якорь не сможет отловить сообщения об изменении модели текста находясь вне текущего дерева фреймов. Причины этого, в принципе, понятны, в бесконечных документах может быть неограниченно много отображений, роутинг каждого сообщения в каждое из отображений занимал бы довольно много времени. Вместе с этим, непонятно, почему не предусмотрена возможность создания спец-отображений, которые могли бы получать соответствующее сообщение даже находясь в невидимой зоне. Избегать злоупотребления можно было бы специальными механизмами, всё же лучше ограничения, чем полная невозможность. Однако, в самих текстах есть вполне конкретные средства взаимодействия с внедрёнными отображениями, через хендлер HandlePropMsg. Вот что удалось выяснить:
Далее, как мы уже знаем из прошлых сообщений про якоря, отображение внутри контейнера может получить доступ к своему предку. Но остаётся проблема, отображение получает сигналы в остальные хендлеры (Model, View, Ctrl) только когда оно видимое. А эти хендлеры нам нужны, чтобы получать самое важное сообщение в рамках задачи автокомплита - сообщение TextModels.UpdateMsg. Решение нам подсказывает документация (а на самом деле - исходник DevMarkers). Можно создать отображение и внедрить его в текст таким образом, что для текста ничего не изменится. В свою очередь само отображение не будет давать себя сохранять в документе, используя метод Stores.Store.ExternalizeAs. Итак, всё готово, чтобы приступить к набору текстов в ББ. |
Автор: | Пётр Кушнир [ Среда, 21 Август, 2013 00:07 ] | ||
Заголовок сообщения: | Re: Предпосылки для автокомплита, подсветки скобок и прочего | ||
Реализуем два отображения. Первое - стандартный якорь. Висит в тексте, сохраняется, загружается. В нём будем слушать три сообщения, о которых я говорил ранее. Для начала будем реагировать на самое надёжное, TextModels.Pref. Реагируя на него мы понимаем, что-то или кто-то меняет текст, в котором мы сейчас находимся. Реализуем второе отображение. Назовём его курсором. Напишем такой код в первом отображении, который будет размещать единственный курсор в видимой области текстового отображения, если его там нет, а так же код будет следить за тем, чтобы курсор был единственный в тексте. Вставка/удаление курсора никак не влияет на содержимое текста. Это даёт нам возможность манипулировать курсором постоянно. В то же время, курсор, находясь в видимой области, получает все возможные сообщения. Остаётся пара шагов, сделать вставку курсора в текст отложенным действием (как выяснилась, если изменить модель сразу по получении TextModels.Pref то будет ошибка), и реализовать метод курсора ThisModel, для того чтобы курсор мог ловить модельные сообщения от текста. Вуаля. Мы получили без всяких обёрток и прочей сложной фигни способ реагирования на изменения в тексте документа. Можете изучить документацию по TextModels.UpdateMsg это реально мощное сообщение, почти все операции будут подконтрольны нашему курсору. Для проверки концепции реализуем вывод в лог символов, введённых в текст. Ровно таким же способом можно реализовать отслеживание позиции текстового курсора для мгновенных реакций, типа подстановки угаданного слова, или там, замены аттрибутов перед скобками. Такие дела. Код в аттаче. Курсор красненький, якорь чёрненький. На написание модуля потрачено 3 часа, всего было 6 тыс. нажатий клавиш. Такая вот статистика.
|
Автор: | Пётр Кушнир [ Среда, 21 Август, 2013 00:22 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
В предоставленном примере никак пока не обрабатываются различные нештатные ситуации, типа удаления курсора руками, или прочее. В целом, алгоритм действий такой - жмём коммандер внизу модуля, набираем тексты под якорем, а когда наберём достаточно много, то прокрутка скроет якорь, а курсор сам переместится в левый верхний угол. Возможно, для него лучше подойдёт форма тонкой линии вверху документа, которая будет всегда переносить строку после себя. Дальнейшие шаги такие - в обработку изменений текста встраиваются механизмы, например, частичного фонового разбора исходника, некие механизмы подбора, и результирующая строка в блоке выделения подставляется под текстовый курсор. Пользователь жмёт дальше символ - выделение забивается, подбирается новый вариант. Но это уже отдельный проект, конечно. |
Автор: | Пётр Кушнир [ Среда, 21 Август, 2013 15:46 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
Да это же автокомплит! |
Автор: | Иван Кузьмицкий [ Среда, 21 Август, 2013 15:54 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
Если вам чего-то в ББ не хватает, то это только по причине вашей лени. |
Автор: | Пётр Кушнир [ Пятница, 23 Август, 2013 15:53 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
Поступательное развитие механизмов, которые приведут к автокомплиту можно наблюдать здесь https://bitbucket.org/akastargazer/bb.o ... 3200cefd02 А можно даже поделиться ценной информацией насчёт модных молодёжных тенденций в области автокомплита и прочего анализа исходных данных за промежуток времени меньший, чем среднее время зрительной реакции человека. |
Автор: | Иван Денисов [ Пятница, 23 Август, 2013 20:01 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
Пётр Кушнир писал(а): Поступательное развитие механизмов, которые приведут к автокомплиту можно наблюдать здесь https://bitbucket.org/akastargazer/bb.o ... 3200cefd02 А можно даже поделиться ценной информацией насчёт модных молодёжных тенденций в области автокомплита и прочего анализа исходных данных за промежуток времени меньший, чем среднее время зрительной реакции человека. Пётр, а возможно ли к разрабатываему вами подходу прикрутить подсветку парных скобок? Привел в приличный вид: viewtopic.php?f=47&t=4376&p=81825#p81825 Все работает там почти идеально за исключением того, что обертки дают отстойный побочный эффект!!! Большой текст при прокрутке начинает мелькать и тормозить. А раз тут механизм без оберток, то и тормозов таких не дожно быть ведь. А то обидно, такая фишка пропадает из-за этого мелькания. |
Автор: | Пётр Кушнир [ Пятница, 23 Август, 2013 21:16 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
Да, модуль ypkTextProbe предоставляет функции низкоуровневого слежения за текстовой моделью, в том числе и за перемещением курсора. Просто разместите в тексте якорь ypkTextProbe и он сразу начнёт вещать в межмодульную шину об изменениях. А в своём модуле реализуйте что-то типа Код: PROCEDURE HandleBusMsg* (VAR msg: ANYREC); BEGIN WITH msg: ypkTextProbe.NotifyMsg DO IF (msg.model = TextViews.FocusText()) THEN (* работаем только с сообщениями из активного текста *) ваш код по работе со скобками END ELSE END END HandleBusMsg; Подробнее про сообщение NotifyMsg можно узнать в документации. Единственная проблема - таких сообщений будет много, ведь они сообщают о наиболее низкоуровневых операциях, поэтому возможно вам придётся чуть оптимизировать код. |
Автор: | Пётр Кушнир [ Понедельник, 26 Август, 2013 11:23 ] |
Заголовок сообщения: | Никаких больше предпосылок, хы-хы. Закапывайте. |
Как выяснилось, работа с TextModels.Pref имеет один недостаток, если в тексте после позиции якоря находится ещё одно отображение, то сообщение Pref направляется ему, а не якорю. И ещё обнаружилось, что даже TextSetters.Pref долетают до якоря только если он находится в окрестности видимой области текста, не превышающей длину кэша TextModels.Reader. Такая вот неприятность. |
Автор: | Kemet [ Понедельник, 26 Август, 2013 12:47 ] |
Заголовок сообщения: | Re: Никаких больше предпосылок, хы-хы. Закапывайте. |
Пётр Кушнир писал(а): Такая вот неприятность. Пётр, а как ты планируешь обойти ещё одну неприятность в области автодополнения кода, когда имя модуля может не совпадать с именем файла, да и реализаций модуля(т.е. файлов) может быть несколько, например под разное окружение: Windows, Linux, A2 и т.п.? |
Автор: | Иван Кузьмицкий [ Понедельник, 26 Август, 2013 13:34 ] |
Заголовок сообщения: | Re: Никаких больше предпосылок, хы-хы. Закапывайте. |
Kemet писал(а): ...имя модуля может не совпадать с именем файла, да и реализаций модуля(т.е. файлов) может быть несколько, например под разное окружение: Windows, Linux, A2 и т.п.? Я считаю, что без введения понятия "проекта" тут не обойтись. Стандартные соглашения ББ тесноваты. А системе автодополнения всё равно, кто ей подсунет словарь.
|
Автор: | Пётр Кушнир [ Понедельник, 26 Август, 2013 16:02 ] |
Заголовок сообщения: | Re: Очередные предпосылки. Раскапывайте. |
Пётр Кушнир писал(а): Как выяснилось ... Такая вот неприятность. Закопал концепцию курсора в тексте, реализовал несохраняемую обёртку текстового контроллера. Но размещением обёртки при загрузке документа занимается всё тот же якорь-шпион. Таким образом, мы оставляем за собой возможность регулировать поведение сервиса автокомплита в разных документах. |
Автор: | Пётр Кушнир [ Понедельник, 26 Август, 2013 16:06 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
Kemet писал(а): Пётр Кушнир писал(а): Такая вот неприятность. Пётр, а как ты планируешь обойти ещё одну неприятность в области автодополнения кода, когда имя модуля может не совпадать с именем файла, да и реализаций модуля(т.е. файлов) может быть несколько, например под разное окружение: Windows, Linux, A2 и т.п.? |
Автор: | Пётр Кушнир [ Понедельник, 26 Август, 2013 16:09 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
Пётр Кушнир писал(а): Подробнее про сообщение NotifyMsg можно узнать в документации. Единственная проблема - таких сообщений будет много, ведь они сообщают о наиболее низкоуровневых операциях, поэтому возможно вам придётся чуть оптимизировать код. В плане интерфейса ничего не изменилось, всё работает, как раньше. |
Автор: | Иван Денисов [ Понедельник, 26 Август, 2013 16:17 ] |
Заголовок сообщения: | Re: Очередные предпосылки. Раскапывайте. |
Пётр Кушнир писал(а): Пётр Кушнир писал(а): Как выяснилось ... Такая вот неприятность. Закопал концепцию курсора в тексте, реализовал несохраняемую обёртку текстового контроллера. Но размещением обёртки при загрузке документа занимается всё тот же якорь-шпион. Таким образом, мы оставляем за собой возможность регулировать поведение сервиса автокомплита в разных документах. Пётр, у тебя текст не мелькает при прокрутке? |
Автор: | Пётр Кушнир [ Понедельник, 26 Август, 2013 16:27 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
Нет. |
Автор: | Борис Рюмшин [ Понедельник, 26 Август, 2013 19:02 ] |
Заголовок сообщения: | Re: Очередные предпосылки. Раскапывайте. |
Иван Денисов писал(а): Пётр Кушнир писал(а): Пётр Кушнир писал(а): Как выяснилось ... Такая вот неприятность. Закопал концепцию курсора в тексте, реализовал несохраняемую обёртку текстового контроллера. Но размещением обёртки при загрузке документа занимается всё тот же якорь-шпион. Таким образом, мы оставляем за собой возможность регулировать поведение сервиса автокомплита в разных документах. Пётр, у тебя текст не мелькает при прокрутке? Тут стоит указывать в каком окружении: под wine - проблемы с большими текстами есть. |
Автор: | Пётр Кушнир [ Понедельник, 26 Август, 2013 21:55 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
Борис, насколько я понял, Иван интересовался о влиянии новой обёртки на флики. Я коротко ответил, уходил с работы. Могу пояснить, что в принципе, обёртка контроллера не должна влиять на флики при прокрутке, так как прокрутка основную нагрузку производит перерасчётом сеттеров, которые при большой длительности действительно могут задержать перерисовку и вызвать флик. А насчёт обёртки отображения, которую реализовал Иван, я пробовал её, она на моём компьютере лишь немного замедляет прокрутку, однако никаких морганий нет. |
Автор: | Пётр Кушнир [ Понедельник, 26 Август, 2013 22:22 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
Между тем, наконец-то реализовал связку механизма, который следит за вводом пользователя и механизма, который предоставляет функции словаря. И оно даже работает. http://www.youtube.com/watch?v=ZEc1erqb ... e=youtu.be Практической ценности у автокомплита ключевых слов конечно нет, руки не успевают среагировать на подсказку и набирают всё сами Но если реализовать службу, которая будет дополнять словарь всякими полезными словами, например названиями модулей и процедур, то наверное, автокомплит будет иметь смысл. И даже заслужит себе звание отдельного компонента. |
Автор: | Пётр Кушнир [ Вторник, 27 Август, 2013 13:14 ] |
Заголовок сообщения: | Re: Предпосылки для подсветки скобок, автокомплита, и прочег |
Возник такой вопрос, какие ещё функции по контролю над исходником могут быть полезны человеку, помимо автоподстановки окончаний слов и всяких названий полей/методов/сигнатур процедур и функций? Вот, например, подсветка скобочек под курсором. Автогенерация тела процедуры/цикла/рекорда после ввода заголовка. Что ещё? Нужны идеи для того, чтобы нарастить функциональные возможности механизма якоря/обёртки и потом уже переключиться в режим наращивания мощности конкретных прикладных механизмов. |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |