Подсветка синтаксиса конфигурационных файлов TC

Если вы хотите поделиться с другими пользователями секретами Total Commander, знаете интересные опции, приемы, настройки, то вам сюда.

Модераторы: Nik, d-view, Моторокер, Avada, CaptainFlint

Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Подсветка синтаксиса конфигурационных файлов TC

Сообщение yozhik »

Для редактирования файлов конфигурации Total Commander, как известно, располагает собственными, встроенными средствами. Кроме того, удобные для редактирования инструменты предоставляет программа Ultra TC Editors от другого разработчика. Но тем, кто иногда предпочитает делать это в текстовых редакторах, могут пригодиться настройки подсветки синтаксиса упомянутых файлов. Синтаксису конфигурации TC (точнее, синтаксисам, т.к. конфигурации различаются по типам) присущи некоторые характерные особенности, восприятие которых мы можем сделать более комфортным, используя подсветку.

Нелишним будет уточнить, что кроме собственно подсветки, текстовые редакторы могут располагать и другими удобствами для работы с кодом: сворачивание блоков (структурирование), автодополнение ключевых слов и блоков, всплывающие подсказки правил синтаксиса, и др. Всё это также доступно настройке с учётом особенностей TC. Употребляя для краткости слово «подсветка», мы также подразумеваем и другие, перечисленные здесь функции.

В этой теме предлагается обнародовать и обсуждать настройки подсветки конфигурационных файлов Total Commander и его плагинов. В разных текстовых редакторах разные подсветки для разных типов конфигурации.

Редактор AkelPad:
  1. Подсветка usercmd.ini и *.bar — конфигурация пользовательских команд и панелей кнопок:
    Изображение
  2. Подсветка *.mnu — конфигурация выпадающих меню:
    Изображение
  3. Подсветка *.aucfg — конфигурация плагина Autorun.wdx:
    Изображение
Последний раз редактировалось yozhik Ср окт 01, 2025 15:30, всего редактировалось 1 раз.
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik
Дело нужное, спасибо за ваш труд! Взял последний aucfg.coder, полёт нормальный. Почему-то в заголовке файла указана дата от 20.09.2025, хотя актуальная версия на 2-3 дня новее, но это так, мелочи.

aucfg.coder
Небольшое наблюдение. Свойства и методы объектов выделяются сейчас вместе с переменной. В некоторых случаях это смотрится хорошо, как например в этом вызове buf.size и buf.ptr:

Код: Выделить всё

Static buf = Buffer(256)
buf.Zero()
Local nSymb = DllCall("GetLogicalDriveStringsW", "dword", buf.size, "ptr", buf.ptr)   
If Not nSymb Then
Хотя видно, что "buf =" выделяется одним цветом, а "buf." другим. Но если взять более длинные имена переменных, то свойства и методы, указанные после точки, начинают еще больше с ними сливаться. В итоге получается разный цвет одних тех же переменных в соседних строках.

Код: Выделить всё

For i = 0 To aFiles.Count - 1
    If aSnap.IndexOf(aFiles[i]) = -1 Then
    aNewFiles.Add(aFiles[i])
    
aSnap = aFiles.Clone()
aSnap.SaveToFile(TEMP & "\tc_dir_snap.lst")
Может стоит попробовать выделять только после точки? Не уверен, что это будет хорошо, но вы попробуйте. Если вам самому понравится, оставьте в будущих версиях.

bar.coder
Ключи с cm_командами сливаются с самими командами:

Код: Выделить всё

cmdxx=cm_SwitchHidSys
cmdxx=cm_SetAttrib
Хотелось бы, чтобы ключ "cmdxx=" (именно только этот ключ до знака =) выделялся отдельным фоном. И именно фоном, а не просто цветом шрифта. Когда открываешь бар-фай в редакторе, первым делом пытаешь различить номера ключей, но сделать это не так просто, когда все сливается одним цветом и нет никаких маркеров:

Код: Выделить всё

button50=
cmd50=
param50=
iconic50=
menu50=
button51=
cmd51=
param51=
iconic51=
menu51=
button52=
cmd52=
param52=
iconic52=
menu52=
button53=
cmd53=
param53=
iconic53=
menu53=
button54=
cmd54=
param54=
iconic54=
menu54=
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Orion9
Пардон, я тут чуть запропал.
Orion9 писал(а):Хотелось бы, чтобы ключ "cmdxx=" (именно только этот ключ до знака =) выделялся отдельным фоном
Вообще-то блок кнопки начинается с ключа buttonxx, и если подсвечивать, то логичней его. Ключ cmdxx по отношению к нему на втором месте. Тем более, что в кнопках попадаются разделители, в которых всего лишь два ключа: buttonxx и iconicxx, а cmd отсутствует.
Orion9 писал(а):Когда открываешь бар-фай в редакторе, первым делом пытаешь различить номера ключей
Я их по узлам слева различаю и в панели CodeFold они чётко видны списком — мне достаточно. Вот как это выглядит:
Изображение
И поскольку глазу есть «за что ухватиться», я стараюсь цветом не пестрить. Вместе с тем
Orion9 писал(а):Ключи с cm_командами сливаются с самими командами
у Вас, насколько я знаю, отключены Bold/Italic, а в исходном варианте они вносят достаточно отчётливости, на скрине видно.

Вообще, при создании подсветки (в AP), условия каковы? 1) — пользоваться лучше встроенными переменными (OP, TYPE, AREA и т.д.), а не указывать цвет напрямую, чтобы работало одинаково корректно во всех темах, как светлых, так и тёмных. А переменных этих немного — 12, из которых 3 (STR, COMM, DEL2) выпадают из палитры доступного. Потому и вводится стиль шрифта, как дополнительный отличитель. А ещё — 2) — bar.coder не только для bar, но и для usercmd.ini — у них синтаксис одинаковый, а имена ключей различаются. И надо так подсвечивать одни, чтобы не задевать другие.

В общем, я сделал, как Вы писали (постоянная подсветка фона начала кнопок), но код мне самому кажется громоздким (может и напрасно). Хотя на быстродействие подсветки это не влияет. Посмотрите здесь, пожалуйста (жёлтым я выделил строки, которые отвечают за подсветку фона):
https://github.com/yozhic/AkelPad-coder ... er#L64-L72
Это branch, и если Вам понравится, то я перенесу эти строки в основную ветку. Но оставлять их активными пока не хочется, т.к. если Bold/Italic не отключать и CodeFold держать открытым, то яркости достаточно. Думаю, закомментирую их с объяснением, и кто захочет, раскомментирует и будет пользоваться. (Этот файл, который по ссылке откроется, в «нерабочей» кодировке (UTF-8 ), поэтому содержимое лучше копипастой переносить к себе в bar.coder.)

Собственно, поэтому также и подсветку TC-шных команд cm_ и em_ не хочется менять, что она рассчитана на доп. выделение стилем шрифта. Может быть так попробуем: Вы бы пока в этих двух строках (два комментария не в счёт)
https://github.com/yozhic/AkelPad-coder ... er#L84-L87
раскрасили бы себе фон, например как-нибудь так (вместо последнего 0 перед закр. скобкой):

Код: Выделить всё

;--TC internal commands--
0	`(?<=\W)cm_[a-z0-9]++`     `\0=(4,${OP},#FFF2E6)`
;--TC extended commands--
0	`(?<=\W)em_[a-z0-9_]++`    `\0=(3,${TYPE},#FFF2E6)`
Если в целом нормуль, то может добавим так же закомментированным вариантом.

Теперь aucfg. В этом примере:

Код: Выделить всё

aSnap = aFiles.Clone()
aSnap.SaveToFile(TEMP & "\tc_dir_snap.lst")
меня не смущает, что второе aSnap подсвечивается, а первое — нет. Ведь первый aSnap ещё не стал объектом, он только назначается, а второй уже стал, вот он и засветился (и это уже не просто aSnap, а объект). И опять же, при включенных Bold/Italic элементы не сливаются (а я ещё вдобавок сейчас и точку между объектом и методом выделил, чуть более внятно стало). Но я понимаю, Вам Bold/Italic вообще не «зашли». Но тут что-либо менять сложнее, чем в bar. Aucfg — подсветка более комплексная, и поэтому я пока не придумал, как сделать аккуратно, чтобы можно было закомментировать и использовать по желанию либо один вариант, либо другой. Ведь не хочется делать второй вариант отдельным файлом.
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik писал(а):Вообще-то блок кнопки начинается с ключа buttonxx, и если подсвечивать, то логичней его. Ключ cmdxx по отношению к нему на втором месте. Тем более, что в кнопках попадаются разделители, в которых всего лишь два ключа: buttonxx и iconicxx, а cmd отсутствует.
Вы абсолютно правы. Я исходил из последнего опыта использования. Но подсвечивать buttonxx куда более правильно и логично.
yozhik писал(а):Я их по узлам слева различаю и в панели CodeFold они чётко видны списком — мне достаточно.
Я понял. Но узлы меня не сильно спасают. Хочется, чтобы именно фон выделялся, как маркером на бумаге.
yozhik писал(а):у Вас, насколько я знаю, отключены Bold/Italic, а в исходном варианте они вносят достаточно отчётливости, на скрине видно.
Да, не зашла мне эта тема с жирным и курсивом, даже не знаю почему, нет объяснений. Может и правда еще раз стоит попробовать.
yozhik писал(а):1) — пользоваться лучше встроенными переменными (OP, TYPE, AREA и т.д.), а не указывать цвет напрямую..
2) — bar.coder не только для bar, но и для usercmd.ini — у них синтаксис одинаковый, а имена ключей различаются..
Спасибо за объяснение и напоминание про usercmd.ini. Я внёс предложенные изменения (вернее пресохранил файл bar.utf8.coder в юникод) и добавил цвет шрифта через переменную CodeFold_TagMarkTextColor:

Код: Выделить всё

773	0	${CodeFold_TagMarkTextColor}	${CodeFold_TagMarkBkColor}	"button1"	"="	""	""	""	0	0
773	0	${CodeFold_TagMarkTextColor}	${CodeFold_TagMarkBkColor}	"button2"	"="	""	""	""	0	0
773	0	${CodeFold_TagMarkTextColor}	${CodeFold_TagMarkBkColor}	"button3"	"="	""	""	""	0	0
773	0	${CodeFold_TagMarkTextColor}	${CodeFold_TagMarkBkColor}	"button4"	"="	""	""	""	0	0
773	0	${CodeFold_TagMarkTextColor}	${CodeFold_TagMarkBkColor}	"button5"	"="	""	""	""	0	0
773	0	${CodeFold_TagMarkTextColor}	${CodeFold_TagMarkBkColor}	"button6"	"="	""	""	""	0	0
773	0	${CodeFold_TagMarkTextColor}	${CodeFold_TagMarkBkColor}	"button7"	"="	""	""	""	0	0
773	0	${CodeFold_TagMarkTextColor}	${CodeFold_TagMarkBkColor}	"button8"	"="	""	""	""	0	0
773	0	${CodeFold_TagMarkTextColor}	${CodeFold_TagMarkBkColor}	"button9"	"="	""	""	""	0	0
Надеюсь, все правильно сделал и в других местах ничего не нарушится. Результатом доволен! Именно то, что я хотел. Спасибо!

В будущих версиях, конечно, можете закомментировать этот блок.
Это тоже добавил, и результатом тоже доволен.
yozhik писал(а):Aucfg — подсветка более комплексная, и поэтому я пока не придумал, как сделать аккуратно, чтобы можно было закомментировать и использовать по желанию либо один вариант, либо другой. Ведь не хочется делать второй вариант отдельным файлом.
Это было необязательно и только на ваше усмотрение. Оно и сейчас нормально смотрится, если пользоваться короткими именами переменных. Подсветка только бросается в глаза, когда имена и методы длинные, например:

Код: Выделить всё

oVeryLongName.AndLongMethod
Вся строчка горит одним цветом. А когда таких строчек много и все они рядом друг с другом, начинает все немного сливаться.

Ладно. Время покажет. Будем дальше пользоваться вашими хайлатерами. Если что-то обнаружется, обязательно сообщим в эту тему. Спасибо!
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Orion9
Выделение «маркером» buttonNN в bar.coder добавил на постоянной основе — самому зашло :)

«Маркер» cm_ и em_ тоже добавил, но закомментировал. Обновитесь, пожалуйста. Я перечитал справку к 11.56 и внёс в подсветку все недостающие параметры и «механизм» извлечения подстрок.

aucfg.coder обновил до Autorun.wdx 2.2.21 beta.
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik
Спасибо за обнову. Loopback действительно добавил с десяток новых функций в последней версии, т.ч. очень оперативное и нужное от вас обновление.

Забыл спросить. А mnu-файл сейчас поддерживает расширенный формат меню, который недавно появился в Autorun? Просто не было времени самому проверить.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Orion9 писал(а):mnu-файл сейчас поддерживает расширенный формат меню, который недавно появился в Autorun?
Нет, спасибо, что сфокусировали, я упустил из виду, конечно надо добавить. В mnu.coder и помимо этого нужны переделки, я пока не добрался до него.
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik
Да нормально всё. Я тоже ещё не скоро доберусь до расширенного меню, но подумал, что не лишним будет сразу спросить.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik
Возможно и не стоило об этом писать, но в последнем обновлении плагина Autorun добавились функции Min() и Max(). Если создать переменные с такими именами, они будут подсвечиваться как ключевые слова. Наверное, это не правильно:

Код: Выделить всё

Local min, max
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Orion9 писал(а):функции Min() и Max(). Если создать переменные с такими именами
Вот тут бы посоветоваться. Технически можно сделать проверку, чтобы имена ф-ций подсвечивались только в случаях, когда справа от них скобка, а слева нет точки (чтобы не перепутались с методами объектов). Но это добавит глобальную фоновую обработку. Когда в подсветке слишком много обработок (и они ещё не оптимизированы), то перерисовка может начать подтормаживать, и визуально при наборе кода изображение на экране начинает подрагивать — это утомляет. Поэтому я колеблюсь, стоит ли пробовать.

Тут ведь ещё вот что: где-то я читал, кажется когда AutoIt изучал, что давать переменным имена ф-ций можно, но не рекомендуется во избежание путаниц. Ну, т.е. в нашем случае, это могло бы выглядеть sMin (string + Min), sMax и т.п.

Но в целом, мне не сложно добавить упомянутую обработку. Как сделаем? Добавим и посмотрим, будет ли тормозить? Или не будем связываться, а ограничимся соглашением имя_переменной <> имя_функции?

Кстати, я пару косяков в aucfg поправил, и переписал mnu, осталось только обработку em_aucmd дописать. В первом посте теперь интерактивные кнопки — новые версии отображают автоматом, без редактирования поста — так что можно поглядывать ))

UPD: добавил обработку em_aucmd, пока основное, а потом посмотрим что ещё прикрутить.
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik писал(а):Вот тут бы посоветоваться.
Да какие могут быть советы. Мы в этих делах люди маленькие, т.к. все это сугубо на ваше усмотрение и понимание вопроса. Было время я и хайлайтером AutoIt подсвечивал синтаксис Autorun и не жаловался :lol:
yozhik писал(а):Тут ведь ещё вот что: где-то я читал, кажется когда AutoIt изучал, что давать переменным имена ф-ций можно, но не рекомендуется во избежание путаниц. Ну, т.е. в нашем случае, это могло бы выглядеть sMin (string + Min), sMax и т.п.
Резонно. Может и правда лучше ничего не трогать. Спасибо за ответ.
Аватара пользователя
jentoso
Сообщения: 443
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

yozhik
Обновил mnu.coder и при открытии получаю

Код: Выделить всё

---------------------------
Coder плагин
---------------------------
"Mnu.coder" содержит неизвестную переменную "${XNUM}", которая отсутствует в активной теме "Default2". Продолжить?
---------------------------
ОК   Отмена   
---------------------------
TC 11.58 combo, Windows 11 x64
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Ух, пардон, опять забыл )) Обновите, исправил.
Там у меня свои переменные, и я при дублировании изменений на github забываю их переключать на стандартные. Вот они, сейчас закомментированы: одна и вторая.
Amo ergo sum
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Ещё один фикс для CodeFold в aucfg — теперь вся иерархия в Torrent.aucfg отображается корректно.
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik
Обновился. Спасибо. Особенно за коммиты - сразу видно что и куда. Теперь бы еще добраться до того самого расширенного меню, функционал-то Loopback классный добавил на самом деле.
Ответить