случилось чудо! друг вставил в друга! |
[Jan. 23rd, 2022|02:14 am] |
в общем, в редактор вставился символ — и при этом ничего не упало. и даже строка вставилась. синтаксис пока не перекрашивает (не сложно; просто нетерпелось похвастаться).
на самом деле вставка символа — это довольно комплексный процесс, задействует как минимум: backstore (append-only буфер байтов); собственно буфер текста с модификацией aa-дерева; механику колбэков (текстовый фрэйм подвешивает колбэк); undo-буфер; код во фрэйме (через колбэк), который чинит aa-дерево строк и подсветки (в подсветку пока тупо вставляет серое нихуя); а заодно и рендер (и фрэйма, и окна x11). в общем, практически всю актуальную механику редактора. так что то, что оно работает — означает, что основные подсистемы редактора пусть и бажные, но более-менее юзабельные.
скорость, само собой, «мгновенно» (волшебство эльфийских балансированых деревьев). правда, реализация текстового фрэйма (это часть, которая ответственна за отрисовку буфера; view в терминах MVC) говно, но это так и планировалось, изначально делалось на выброс. идея такая, чтобы довести это до состояния «можно редактировать несколько файлов, переключаясь между ними», и переходить к dogfooding.
самая большая ебля в frame, кстати, с уебанским utf-8 (редактор традиционно поддерживает koi, 866 и 1251, плюс utf), и с «визуальными табами» (то есть, в принципе с обработкой ебучих табов). желаю, чтобы в аду любителям совать в исходники табы для ебли выдавали не красивых демонесс, а демонов с огромными хуями (а если ты ставишь табы и тебе понравилось пожелание, то тебе повезло, скотина, и тут выкрутился).
в принципе, реализация фрэйма сейчас очень неоптимальна в части движения курсора (влево-вправо можно делать без сканирования строки каждый раз с начала и до конца, иногда даже по два раза), но это на данный момент некритично. лично мои исходники — в основном ascii, и без табов. редактор достаточно умный, чтобы такие строки отмечать отдельно, и обрабатывать оптимизированой O(1) веткой кода. (на самом деле внутри строки классифицируются на «однобайтовая», «однобайтовая с табами», «утф», по степени тормозов в обработке.)
вообще, у меня в запасе куча идей по ускорению всего, но реализовывать я их буду по принципу: «вот когда будет тормозить — тогда и приходите». всё равно активных пользователей у этого редактора будет один, и с этим одним я уж как-нибудь договорюсь: обычно у меня неплохо получается договариваться с самим собой.
p.s.: тащемта, движок позволяет даже реализовать разные кодировки для разных строк, но нахуй надо. |
|
|
кстати |
[Jan. 23rd, 2022|03:44 am] |
на самом деле технически редактор внутри работает с текстом, пожатым LZ. дерево-то хранит пары «смещение, длина», а текстовый буфер — append only. я этого делать не буду, но в принципе — можно при загрузке текста сразу делать с ним lz-сжатие. одна нода дерева весит чуть меньше сорока байт, так что если находить куски длиннее — оно даже будет экономить память. осмысленности, конечно, в этом никакой, потому что кейворды сильно короче.
зато есть бонус при копировании/перемещении текста: буфер-хранилище байтов при этом не растёт, потому что текст-то у нас там уже есть: редактор просто рихтует дерево кусков. то же самое справедливо для undo/redo: в лог сохраняются позиции удалённых/вставленых кусков.
недостаток тот, что байтовое хранилище никогда не усекается, даже если весь текст удалить. единственный вариант — это почистить буфер и заново туда текст загрузить (undo пропадёт, конечно). на практике этот недостаток совершенно неважен, удобства перекрывают.
(да, дерево достаточно умное для того, чтобы сливать ноды, если это возможно. так что печать кучи символов друг за другом породит одну ноду, а не толпу.) |
|
|
неиллюзорно уважаю котика |
[Jan. 23rd, 2022|04:47 am] |
я писал раньше, что лучший вариант для котика будет просто «я устал, я ухожу», но он не станет. я даже не думал, что он не только станет, но перед уходом ещё и умудрится продать кому-то своё ношеное бельё за дохуя денег. охуительно крутой чувак. |
|
|