Open johnd0e opened 4 months ago
Сделать можно. Вопрос, какие схемы поддерживать. Разным разные захочется, а я не уверен, что в колорер схеме можно это как-то грамотно реализовать. Вопрос к разработчикам.
Пример: так я подлючу 2 схемы, powershell и lua. И только эти две. А нельзя ли как-то параметризировать и сделать возможным более полезное и полное покрытие набора имеющихся схем?
<block scheme="powershell:powershell" content-priority="low"
start="/(?{start}^%FenceMark;(?{FenceMark}powershell))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>
<block scheme="lua:lua" content-priority="low"
start="/(?{start}^%FenceMark;(?{FenceMark}lua))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>
параметризировать нельзя.
@ctapmex и реализовать это проблематично?
мы стоим перед выбором
второе мне пока не нравится.
А схемы разве не "лениво" грузятся? Просто вопрос для инфы, не критика.
Перефразирую в практическом плане. Если в маркдаун схеме добавим 5 таких "фаворитных" языков, то их схемы все будут грузиться при открытии любого маркдауна, даже если он ничего из этих 5 не упомянул?
Что если иначе подойти к задаче? Может ли схема сделать что-то типа "include" пользовательского файла/фрагмента, который может быть, где договорились, а может не быть. (Или можно ли так сделать в будущем, конечно)
загрузка ленивая на уровне прототипов. Прототипы как список загружаем, не погружаясь внутрь. Но как только выбрали один из типов и хотим с ним работать, то загружается всё его описание и все типы, на которые он ссылается, и ссылаются эти типы.
Может ли схема сделать что-то типа "include" пользовательского файла/фрагмента, который может быть, где договорились, а может не быть.
а фрагмент это кусок hrc схемы ? вроде этого
<block scheme="powershell:powershell" content-priority="low"
start="/(?{start}^%FenceMark;(?{FenceMark}powershell))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>
<block scheme="lua:lua" content-priority="low"
start="/(?{start}^%FenceMark;(?{FenceMark}lua))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>
а фрагмент это кусок hrc схемы ? вроде этого
Да. Тогда пользователи, те, кому реально надо, сами могли добавить, что им нужно. Такая фича нашла бы применение и еще где-то в схемах.
это можно сделать и сейчас. добавить в место где необходимо "расширение" блок вида
<inherit scheme="user:markdown" />
а далее через auto, настройки в farcolorer, указать путь до своих схем, в списке которых есть прототип user, с схемой markdown. И в ней уже все необходимые блоки.
если такого файла нет, то блок будет игнорироваться
Надо будет подумать над этим, да.
Еще есть подобная идея с использованием ENTITY. Преимущество, может, в том, что это могут быть фрагменты, а не полностью оформленные схемы. Мой кастомный каталог как-то так делает:
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE catalog PUBLIC "-//Cail Lomecb//DTD Colorer CATALOG take5//EN" "http://colorer.sf.net/2003/catalog.dtd"[
...
<!ENTITY catalog-console SYSTEM "jar:%FARHOME%/Plugins/FarColorer/base/common.zip!hrd/catalog-console.xml">
]>
<catalog xmlns="http://colorer.sf.net/2003/catalog">
...
<hrd-sets>
&catalog-console;
...
</hrd-sets>
</catalog>
Только не знаю еще, что будет, если путь типа &catalog-console;
не будет найден. Может, проблема.
И вообще, будут ли ENTITY работать в схемах, может, это только для каталогов и прото работает.
ENTITY тяжело направить на некий пользовательский файл . Пусть будет прибит жестко.
ENTITY тяжело направить на некий пользовательский файл . Пусть будет прибит жестко.
Переменные окружения работают. Как в моем примере (он реальный, просто кусок).
Что-то типа
<!ENTITY custom-blah SYSTEM "%CUSTOM_BLAH%">
Сработало наполовину. А именно в схеме маркдауна объявляю энтити и использую ее
<!DOCTYPE hrc PUBLIC "-//Cail Lomecb//DTD Colorer HRC take5//EN" "http://colorer.sf.net/2003/hrc.dtd"[
<!ENTITY COLORER_MARKDOWN_FENCE SYSTEM "%COLORER_MARKDOWN_FENCE%">
]>
...
<block scheme="def:empty" region="Code"
start="/(?{start}^ {4,}|\t+)\S.*/" end="/(?{end})\M%i3;\S/"/>
&COLORER_MARKDOWN_FENCE;
<block scheme="def:empty" region="Code"
start="/(?{start}^%FenceMark;).*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>
...
Работает, если %COLORER_MARKDOWN_FENCE% определена и указывает на файл типа такого (просто кусок xml, а не целая схема), "привлекательно и просто":
<block scheme="powershell:powershell" content-priority="low"
start="/(?{start}^%FenceMark;(?{FenceMark}powershell))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>
<block scheme="lua:lua" content-priority="low"
start="/(?{start}^%FenceMark;(?{FenceMark}lua))\s*$/" end="/(?{end}^(?{FenceMark}\y{FenceMark})).*$/"/>
Но если %COLORER_MARKDOWN_FENCE% не определена, то схема вообще не работает.
Может тут колорер как-то помочь? Какие-то конвенции по разрешению ENTITY, чтобы некоторые уметь игнорировать?
<inherit scheme="user:markdown" />
Такой вариант работает. И не так уж и страшно выглядит. И может иметь некоторые преимущества.
Вопрос - есть примеры такого подхода с другими схемами? Какие имена обычно принято выбирать?
user:markdown
- это случайный пример или рекомендованный подход именования таких расширений?
Может тут колорер как-то помочь?
можно изменить обработку ошибок. Сейчас в случае ошибки загрузки entity падает загрузка всего типа. А порой и тех, что пытались его по цепочке загрузить. Будет - нет файла, игнорируем, загрузка продолжается , но может красить не так как ожидалось - надо смотреть логи на ошибки загрузки. во вложении сборка под x64 плагина, debug, можно попробовать. colorer.zip но мне тут не нравится, что пользователь зависит от переменной окружения. О ней надо знать, как-то выставлять при запуске Far (есть адекватный способ?). В любом случае это оставлю в коде. Такая обработка ошибок более правильная.
Вопрос - есть примеры такого подхода с другими схемами? Какие имена обычно принято выбирать? user:markdown - это случайный пример или рекомендованный подход именования таких расширений?
примеров нет. Пришло на ум случайно. На самом деле в текущих схемах есть ошибки, и долгое время в логи шли сообщения об отсутствии отдельных схем (сейчас только для yml осталось). Но это не мешало работать (https://github.com/colorer/Colorer-schemes/issues/114) . Как раз из принципа: нет схемы - игнорируем. user:markdown - это случайный пример, пытался с одной стороны подчеркнуть что это пользовательский тип. С другой, чтобы не пересекалось с реальными типами.
@ctapmex Спасибо, все очень полезно. Буду разбираться, пробовать.
@johnd0e Что-нибудь предложу в итоге, но не "из коробки", а чтобы юзер сам мог настроить, что ему надо. Так правильнее. Хотя у кого-то руки никогда не дойдут (селяви).
План такой. Фантазии на имена у меня хватило на markdown2
:)
В схему markdown добавляю одну строку
<inherit scheme="markdown2:markdown2" />
И кажется это все, что от меня надо.
Далее пользователь может делать то, что я попробовал и сработало.
Надо завести у себя файл markdown2.hrc
пример ниже.
И как-то его представить колореру, кто как привык.
Я делаю это в своем прото файле так
<prototype name="markdown2" group="scripts" description="my markdown 2">
<location link=".\markdown\markdown2.hrc"/>
</prototype>
(тип файлов не указываю, ибо эта схема вызывается неявно из markdown)
Пример markdown2.hrc с двумя дополнительными языками powershell, lua. По аналогии можно добавить другие языки, сколько и какие душа пожелает. Или что-то другое (что хочется и не конфликтует с базовым markdown).
<?xml version="1.0" encoding="UTF-8"?>
<hrc version="take5"
xmlns="http://colorer.sf.net/2003/hrc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://colorer.sf.net/2003/hrc http://colorer.sf.net/2003/hrc.xsd">
<type name="markdown2">
<import type='markdown'/>
<scheme name="markdown2">
<block scheme="powershell:powershell" content-priority="low"
start="/(?{start}^(%FenceMark;)(?{FenceMark}powershell))\s*$/" end="/(?{end}^(?{FenceMark}\y1))\s*$/"/>
<block scheme="lua:lua" content-priority="low"
start="/(?{start}^(%FenceMark;)(?{FenceMark}lua))\s*$/" end="/(?{end}^(?{FenceMark}\y1))\s*$/"/>
</scheme>
</type>
</hrc>
@nightroman
Супер. Не скажу что прям правильно, но раз от этого расход памяти зависит..
Предлагаю для примера положить в auto файлик. Или закомментированный, или с одной какой-то схемой.
Класть ли в авто и в каком виде, это @ctapmex лучше решить, наверное. Можно "закомментированный", либо с двумя предложенными схемами. Ибо lua - это язык автоматизации Фара и не только. И powershell - это язык автоматизации Фара и не только.
Подожду еще комментов и идей и "посплю на этом". Завтра где-нибудь пул реквест оформлю.
можно чуть усложнить
<scheme name="standard-lang" if="inherit-standard-lang">
. Параметр по умолчанию включен.markdown2:markdown2
для себяможно чуть усложнить
Душа не лежит к этому, так сказать. Забить схемы по умолчанию можно было уже в 2017, смотри ссылку вначале. Тогда не хотелось так делать и сейчас не хочется. Причины всякие разные.
Непонятно, что забивать по умолчанию. Сколько языков? - у нас уже 3 предложения есть, 1, 2, 10. Какие эти популярные языки? - тема еще та.
Многим, наверное, не нужна эта раскраска в некотором спорном наборе языков по умолчанию. Мне вот нравится, что код не подсвечен, и подсветка не отвлекает от написания остального текста и фокуса на нем. Код редактируется где-то еще, а не в маркдауне, и там он пусть будет подсвечен, а не в маркдауне.
Словом, начнем с простого добавления возможности расширения через markdown2. Это хороший и гибкий подход. Думаю задействовать и в других схемах. Дальше посмотрим. Также, нужно больше вовлеченных людей для других решений.
Пул реквест готов.
Добавлю про параметры схем для кастомизации. Пробовал с ними играться. Смешанные чувства. В итоге стараюсь не использовать. Меня отпугивает относительное неудобство в UI, невозможность посмотреть все свои параметры по всем схемам (я же забываю где, какие, когда поставил).
Колорер весь устроен на XML файлах. Наверное, мне бы больше понравилось, если бы и параметры схем задавались в некотором файле. И если бы UI и редактировал этот файл, вообще было бы хорошо. Не предлагаю ничего, так, мысли вслух.
описание/пример добавлю позднее
невозможность посмотреть все свои параметры по всем схемам (я же забываю где, какие, когда поставил).
Кстати да. Можно подумать как улучшить ситуацию. Например, что если дополнить функционал импортом/экспортом.
Т.е. параметры меняем в интерфейсе как сейчас, но есть кнопка, по которой экспортируется (или открывается в редакторе) файл, где в каком-либо формате собраны все наши изменения в параметрах.
И таким же образом реализовать импорт.
@nightroman Я не совсем понял как это должно работать после PR, но описанное выше (https://github.com/colorer/Colorer-schemes/issues/151#issuecomment-2106319102) вполне функционирует.
Файл я поместил в auto, и прототип добавил в него же.
Возможность этого обсуждалась на форуме: https://forum.farmanager.com/viewtopic.php?p=147413#p147413
Суть: если указан тип (
~~~lua
), и он соответствует какому-либо определённому в базе идентификатору, то было бы здорово подсвечивать синтаксис в этом блоке соответственно.@nightroman