Образец раскрашивания просмотрщика. Конечно, не идеальный, но лучше, чем ничего...

Системные настройки, которые влияют на корректную работоспособность. По порядку сверху-вниз:
- MaskFile (6 полей: eng, rus, code, log, hex, none) — указывает, какие файлы должны открываться в определённых схемах, чтобы исключить влияние AutoScanner.
- AutoScanRun - запускает автоматический анализ содержимого экрана (соотношение eng, rus, знаков, триггеров). Может ошибаться, но вроде правильно определяет TXT от EXE.
- ShowScan - отображает в верхнем статусе количество символов, знаков и итоговый результат выбора схемы. Полезно для дебага, никакой полезной функции не несёт, но возможно Юзерам тоже интересно понаблюдать, пусть будет (все равно этот программный код всегда существовал во всех старых версиях, но не было возможности их включать)
- HistoryScheme - запоминает выбранную схему для каждого файла (через F5 / AltF5) в
20-и слотах памяти в базе-данных (при переполнении начнется замещение самых старых-редких записей). Может сохранять по расширению*.ext(выбранная схема будут применяться для всех типов файлов с этим расширением), по конкретному файлуfile.ext, или по полному путиC:\folder\file.ext. Полезно, если Юзер ежедневно изучает длинный документ, а AutoScanner на момент открытия на разной странице документа постоянно глючит, то-code-, то-log-. Юзер может выбрать 1 раз нужную схему и подождать10сек, и сохранится в память. (мне по большому счету не пригодился данный пункт, но может кому-то еще полезно). - [log ] by Default - схема по умолчанию ("log", "code" и прочее), которая применяется при нераспознанных случаях (отсутствие
MaskFile, не смогAutoScannerи нет раннее использованных схем вHistoryScheme). - ShowListScheme - показывать маленькое всплывающее окошко Списка Схем при нажатии
F5/AltF5(можно поменять на другие клавиши, напримерCtrlK/ShiftJ. Или впишитеF20для частичного отключения) - Safe - тоже относится к показу Списка Схем, но отрисовывается силами FarAPI (не WinAPI). Преимущества FarAPI: самоубирающее окошко через доли секунды. Но есть недостаток, клавиши клавиатуры плохо "ощущается", хотя может Юзеры не замечали, пока не написал об этом =)
- RefreshTSR - обновление экрана силами резидента (TSR) по таймеру каждые
100мс. Полезно для автоматического обновления логов, где FAR Viewer постоянно обновляет содержимое файла (RealTime). В этом случае TSR отслеживает изменения и перерисовывает экран. Совет: если отключён обработчик клавиш (RefreshKEY), лучше уменьшить таймер до35мс — это позволит быстрее и резво перерисовать после клавиш-навигации. - RefreshKEY - обновляет экран с помощью событий клавиатуры/мышки, при ОТжатии клавиш: Up / Down / PageUp / PageDown и т.п. По моему мнению, это полезный пункт — обычно не требуется отключать, оставил на всякий случай, на случай конфликтов (у меня такого не было).
- WorkIndicator - индикатор в верхнем углу: красный (TSR), желтый (KEY), зеленый (запись в HistoryScheme). Помогает видеть активность системы (ну и в ранних версиях ViewColor - была наглядная демонстрация скорости отрисовки: насколько долго висит красный знак? вот настолько долго выполнялся неоптимизированный тяжелый код). В целом можно отключить, нужно лишь для дебага в ранних стадии развитии ViewColor, когда не было понимания в надежности работы всех узлов "великого и могучего Far'а" =) Для меня, полезно видеть куда расходуются ресурсы, например, "желтая" (KEY) раскраска и вслед за ней идет красная (TSR) раскраска - зачем два раза?
- ViewDumpClean - очистка Dump/Hex от разноцветных символов, цифр, букв как циганщина непотребство. Стоит на это один раз посмотреть, чтобы понять всю сущность бытия и преисполнится...
- OffColorInF7 - отключает раскраску при Shift/Alt/Ctrl+F7. Полезно, если яркость выделенного текста слишком низкая. (в дефолтном FAR'е, я практически не вижу где этот выделенный блок).
- ConEmuRefreshForcibly - если используете
Windows Terminal, отключайте (или ViewColor сам сообщит о "разбитом экране", когда появятся иероглифы и посоветует отключить этот параметр). В случаеConEmuчасть пользователей сталкивалась с тем, что раскраска вовсе не работала, и нужно было принудительно активировать её с помощью кода "волшебного пинка под зад ConEmu". В целом рекомендуется отключать, если убедились, что без этого пункта все отлично работает, это повышает производительность на 30% (редко 50%). - ConEmuRefreshApiFar - (если это включено, то НЕ учитывается предыдущий пункт Forcibly). Использует вывод раскраски через сам FAR, а не WinAPI, что даёт возможность управлять RGB-цветами (если поддерживается, т.е. обращайте внимание на надпись
Status: Far is RGB). Недостаток — клавиши управление ощущаются ватными, в верхнем углу виден "прыгающий мячик", что говорит о удержании экрана и ожидании следующих клавиш. Иногда можете увидеть надпись, мол для комфортной работы с этим пунктом (FarApi) желательно иметь версию Far v6369 или выше, чтобы не ощущать дискомфорт "подзависшие" клавиши курсора или PgUp/PgDn. - ColorTableRGB - если появится надпись
Status: Far is RGB, можно включить этот параметр и увидеть собственную палитру цветов, настраиваемую внутри ViewColor (поиск поColorTableRGB). Можно подстроить палитру так, чтобы цвета были более мягкими, не бросались в глаза. Например, сделать красный и фиолетовый более белыми с оттенками. Это помогает сделать русский текст более читаемым с нежной розовой подсветкой. (да, этот бред написал сам чатгпт=)
Need ESC->F3). В некоторых случаях, например, переназначения клавиш F5/AltF5, потребуется Restart в главном меню или перезапустить FAR.Пока не придумал, как правильнее назвать, решил назвать "Global", так как по сути сюда входят изменения цветов, которые влияют глобально на все схемы: "eng", "rus", "code", "log", "hex". Также это удобно тем, что есть хоткей на букву G.
- ColorHexAddress - раскрашивает в Hex-экране адресные строки.
- ColorHexDigital - раскрашивает в Hex-экране шестнадцатеричные строки.
- ColorFarSystem - автоматически распознает из системных настроек FAR (в верхнем углу иногда можно видеть мелькания
1234) - это запись RGB-кода на экран и последующего чтения 4-bit цветового кода. На мой взгляд это надежный способ, но вConEmuпроисходят какие-то странные аномалии, поэтому оставлена возможность ручного управления (снять галочку и ввести свои значения). Важно не ошибиться с цветовыми кодами, иначе может затеретьвыделенный текств поиске F7 (в диалоге об этом явно предупреждаетсяneed exact value to not losing selected block). В общем, как догадались, территорияConEmu- это страшный сон программиста... - ColorUserText - тоже для страшных снов с
ConEmu, кто хочет довести до стресса правильной работы с цветами. - ColorUserCmnt - в стандартной реализации
комментарииимеют самый тусклый цвет, чтобы подчеркнуть, что это не активная часть кода. Однако у разных ЖК-мониторов бывают проблемы - у тех, у кого офисные ноутбуки купленные на распродаже 11.11 с синючими экранами, то предпочитают включать темно-голубой цвет, а у тех, у кого хороший контраст и красные цвета яркие, - можно смело выбрать значение5(темно-фиолетовый), что позволяет лучше видеть и отличать комментарии от голубого кода. В ViewColor часто можно видеть переменнуюColorUserCmntDark- она отвечает за выбранный пользователем цвет, заданный в конфигураторе.
Вторая переменная -ColorUserCmntLight- пока не применена в кодах ViewColor, но оставлена для будущих целей для пользователя. Её можно привязать к чему угодно, например, к русскому тексту или знакам-синтаксическим символами и т.д. и управлять на быструю руку через конфигуратор (например, установив кодA- зеленый илиC- красный и т.д.)
Встроенный бенчмарк позволяет оценить быстродействие, длительность всего 1 минута (точнее 50 секунд), и выдаст три значения FPS:
- среднее (без учёта максимума и минимума, поскольку эти числа считаются "браковочными", так как пути LuaJIT неисповедимы).
- минимальное — это
у LuaJIT болит голова.- максимальное — это
у LuaJIT хорошее настроение.Часто бывают рандомные значения, поэтому среднее рассчитывается без учёта максимума и минимума. Для надежности показателей, мне приходится каждый раз перезапускать FAR, и даже там у LuaJIT настроение как у ...
Для эксперимента лучше найти большой документ, например, в комплекте FAR —
Changelog. Правда, схема -log- — это не самая тяжёлая нагрузка. Наверное, самая тяжёлая нагрузка — это просмотр ViewColor.lua в схеме -code- (лучше дважды скопировать самого себя, так как у меня быстро доходит до конца, и в конце экран замирает, резко повышается FPS). Или открыть просмотр Far.exe в режиме Dump (Shift-F4: Dump) и запустить бенч.На коротких файлах, например, вмещающихся на один экран, могут выдаваться слишком высокие FPS. Возможно, причина в том, что функции WinAPI не задействованы в полной мере, поэтому всё происходит борзо-резко, или LuaJIT читерит...
На моем компе (сборка 16 года) в среднем отрисовка составляет Avg=80fps. Думаю, это нормально-терпимо. Однако интересно, у кого насколько получается, так как нередко вижу, как окна FAR растягивают до 300х100 символов...
Если чувствуется, что еле ползёт (Avg: 15-25fps), рекомендуется выполнить следующие шаги:
В конфигураторе
System:
- включить ViewDumpClean (очистка экрана в Dump'е). Магическим образом LUA легче выполнять сложный код внутри себя, чем раскрашивает новогоднюю ёлку на экране...
- вЫключить WorkIndicator - даже маленький одиночный знак в верхнем углу вызывает выполнения тяжелых функций WinAPI (FarAPI)
- вЫключить ConEmuRefreshForcibly - это отключит часть программного кода
волшебный смачный пинок под зад ConEmu. Это избавит от лишних вызовов WinAPI, который давал по шапке ConEmu... - проверить по ситуации ConEmuRefreshApiFar - возможно быстрее окажется при активации этого пункта (не рисует на пробельные зоны просмотрщика), или, наоборот, работа с RGB еще больше утяжелит код.
Global:
- Настроить цвета так, чтобы не было несоответствия цвета FarColorText с фоновым цветом букв (например, с ColorUserTextViewer). Проще говоря, чтобы фон Viewer соответствовал цвету фоновых шрифтов (Background). В противном случае ViewColor, заметив различие цветов, запускает тяжёлый код выравнивания краёв с пробельными отступами.
К сожалению, не имею возможности ускорить работу, если не переходить полностью на C++, но это разве что в следующей жизни…
Однако заметил интересный момент: предыдущая версия 0.42 (без конфигуратора) имеет чуть лучшие характеристики по быстродействию (разумеется, при настройке внутри ViewColor переменной ConEmuRefreshForcibly на "false" для повышения скорости). Видимо, LuaJIT более щадяще относится к старым версиям и лучше трассируется горячий код в свой узкий кэш…
Важный момент: учитывайте наличие
ScrollBar (Ctrl-S) — его присутствие снижает FPS примерно на 10..20%. Но лучше с скроллбаром, чем без них...Ну и не лишним будет отметить, что если запущены два бенчмарка в двух разных FAR, то почему-то однопоточность делится ещё на две части, и работает куда медленнее.
Производительность в разных версиях FAR (с v4242, 14г., по v6570, 25г.) особой разницы не заметил, ни между разрядностями x86 и x64. Возможно, влияние составляет около ±10%, но никакого «в 2 раза» не зафиксировано.
Однако отмечено влияние окружения: например, под
ConEmu производительность может быть выше на 20–50%. Вероятно, это связано с тем, что ConEmu по-другому взаимодействует со своей «виртуальной» консолью.В старых версиях ViewColor скорость раскраски была неоптимизированной, поэтому с течением времени в ViewColor постепенно проводились оптимизации быстродействия, и появилась возможность включить режим RealTime (в конфигураторе
— в предыдущих версиях Far были более дергаными и с рывками.
Следующая оптимизация произошла в версии
Тем не менее, если заметили появление дублирующихся строк или артефактов на экране просмотрщика (при включенном пункте ConEmuRefreshApiFar), вероятно, стоит вручную увеличить интервал таймера до
Однако экстремальные настройки режима
Еще интересное наблюдение: на Atom-нетбуке значения
На мощном процессоре
Если по каким-либо причинам просмотрщик (и весь FAR) зависли из-за экстремальных настроек
System, внизу расположена кнопка RealTime). Эта настройка позволяет достичь максимальной производительности и минимального размера таймера 1 мс. Появляется предупреждение (или напоминание), что оптимальный эффект возможен только начиная с версии Far v5804 и выше ( drkns 27.05.2021 23:22:21 +0100 - build 5804
) Движения экрана становятся чрезвычайно плавными - Experimental: removed constant polling from the main thread. This should noticeably reduce CPU consumption and make various idle events more predictable.
- Экспериментальная функция: убран постоянный опрос из основного потока. Это должно заметно снизить нагрузку на процессор и сделать различные события простоя более предсказуемыми.
Следующая оптимизация произошла в версии
Far v6369, где был переработан код обработки таймера, исключив подлагивания всей консоли путем пропуска несостоявшихся событий/u (видимо отсюда пошло) — значительно повысилась плавность навигации и скроллинга. (полезно для ConEmuRefreshApiFar)Тем не менее, если заметили появление дублирующихся строк или артефактов на экране просмотрщика (при включенном пункте ConEmuRefreshApiFar), вероятно, стоит вручную увеличить интервал таймера до
5 или 10 миллисекунд. Это может вызвать небольшое мелькание, но зато устранит проблемы с двойными-тройными строками мусора при навигации с помощью стрелок.Однако экстремальные настройки режима
RealTime едва ли подойдут для устаревших устройств, таких как Atom-нетбуки. Лучше вернуться к исходным настройкам, используя кнопку Default.Еще интересное наблюдение: на Atom-нетбуке значения
1ms на деле НЕ принимается как 1ms, а скорее всего FAR округляет как 15ms (проверено в дебаг-счетчике), видимо для безопасности или лимит отклика самой системы, т.е. это значит, что для Atom-процессоров будет весьма неприятно мелькать во время скроллинга текста (15ms это не 1ms).На мощном процессоре
1ms действительно становится 1ms - очень плавная прокрутка. Но попробовав 0ms - Far опять таки округляет до 1ms по выше означенной причине.Если по каким-либо причинам просмотрщик (и весь FAR) зависли из-за экстремальных настроек
RealTime и не можете попасть в конфигурационный интерфейс (F11), рекомендуется воспользоваться стандартным методом восстановления:
- в режиме панели (не просмотрщик) зайти в верхнее меню (F9)
- выбрать
Options(Параметры) - выбрать
Plugins configuration(Параметры плагинов) - найти
ViewColor...и в конфигуратореSystemнажмите внизуReset— это удалит все установленные ранее параметры в реестре FAR'a. После перезапуска FAR'а - ViewColor вернется к своему первоначальному состоянию.
Целый пласт диалоговых настроек цветов: eng, rus, code, log, hex. Это значительно утяжеляет размер кода примерно в два раза (казалось бы, такие мелочи, как диалог с System и Global, уже занимают 20кБ пространства в никуда).
Поэтому наспех написан примитивный код для открытия редактора:
В верхней части — схема
eng (для справки и комментариев на русском языке), а в нижней — редактор необходимой схемы.Переключать между окнами
Ctrl+Shift+Tab - вверх, Ctrl+Tab - вниз. Обратите внимание на скриншот: эта информация также отображается в статусной строке, чтобы не забыть.Надеюсь, будет понятно, что там и о чём… Например, часто встречается выражение:
b+0x0B — означает фоновый цвет b (background), заданный через конфигуратор, например, автоматически распознается через ColorFarSystem (или ColorFarText, если User вручную настраивает в Menu->Global), а +0x0B — это светло-голубой цвет. Можно писать просто b+13, что равноценно b+0x0B.Также есть выражение
n+0x0B (в старых версиях без конфигуратора был c+0x0B). Это означает цвета, близкие по оттенкам к b. Например, b — это темно-синий, то n — автоматически выбирает самый подходящий фон - черный, или, если b был красным, то n станет фиолетовым — ближайшим по оттенкам цветом (согласно таблице соответствия цветов ColorTableNear).После редактирования схемы необходимо нажать пункт
Restart в главном меню. Это перезапустит ViewColor, и, если потребуется, можно выйти и заново зайти в просмотрщик.Также не завезли в конфигуратор некоторые переменные (флажки), они доступны только при редактирования внутри ViewColor:
- KeyMiniSpisokAltTimer=300 - время в миллисекундах, в течение которого окно остаётся на экране перед исчезновением (работает только в паре с
KeyMiniSpisokAlt=true). Думаю, этот малозначимый параметр не стоит раздувать лишними килобайтами ради пункта в диалоге... - RefreshScreenAlways=false - раскрашивать ли экран всегда, даже если ничего не меняется. По умолчанию —
false, то есть раскрашивание происходит только при движении или изменениях на экране. Полезно только для дебага: было интересно, что произойдет приRefreshAlwaysTime=1иRefreshScreenAlways=true(всегда раскрашивать в течение каждой1ms) — зависнет ли Windows12 или запустится рекурсия в большом коллайдере… Напомню, LuaJIT/Far — таки однопоточный процесс…
- Скачать ViewColor.lua
- поместить в папку \Macros\scripts\ (например, выполнив команду cd %FARPROFILE%\Macros\scripts окажетесь в этой папке)
- перезапустить FAR
- нажав F3-View (просмотрщик) должна появится раскраска, как показана на скриншотах.
Избирательно проверил на нескольких версиях:
- FAR 3367, 13г. - крашится из-за старой версии LUA (не знает команды GOTO, можно сделать костыль, но лень..)
- FAR 3525, 13г. - с v0.42 работает.
- FAR 4040, 14г. - с v0.42 работает. (тяжелый v50 с конфигуратором не пойдёт).
- FAR 4242, 15г. - c v0.42 работает. (для v50 - крайняя беспроблемная версия Far'а)
- FAR 4700, 16г. - c v0.42 работает.
- FAR 4774, 16г. - c v0.29 работает.
- FAR 5225, 18г. - c v0.29 работает.
- FAR 5454, 19г. - c v0.29 работает.
- FAR 5511, 19г. - проверено, работает.
- FAR 6161, 23г. - проверено, работает.
- FAR 6378, 24г. - проверено, работает.
- FAR 6552, 25г. - проверено, работает.
- FAR 5804, 21г. - увеличилась производительность FAR-консоль, ViewColor может работать в режиме RealTime.
- FAR 5805, 21г. - Фаровский Clock (в углу экрана) всегда перекрывает и не видно WorkIndicator (с включенным ConEmuRefreshApiFar)
- FAR 6369, 24г. - таймер больше не накапливает опоздавшие события(?). ViewColor теперь не подлагивает при работе с клавишами.
- FAR 6552, 25г. - путается в показателях Dump/Hex. ViewColor всегда раскрашивает там, где не надо. Версия 6550 и 6558 - норм.
- FAR 6571, 25г. - поправили древнейший баг в QuickView после поиска F7 -> мусор на экране. Подробности.
v51 (25г.) - ускорил производительность на 10% (выкинул лишнюю конвертацию в string)
v50 (25г.) - первый конфигуратор (только System и Global) + RealTime + Benchmark

