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

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

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

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

Сообщение yozhik »

Orion9
К слову о коммитах (если уже знаете, то пардон, я так недавно): если на GitHub'е к адресу коммита добавлять ?w=1, то он прячет шелуху (изменение в пробелах, табах, etc.) — удобнее, лаконичней. Пример:
https://github.com/yozhic/AkelPad-coder ... 983c6d?w=1
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik
Нет, не знал. Спасибо инфу. Мне еще понравилось описание в вашем профиле - читал как на иголках. Одна строчка, а словно триллер качественный посмотрел )
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik
Боюсь, что эпопея с CodeFold еще не закончена и, вероятно, еще долго будет длиться.

После такой функции следующие за ней функции вкладываются:

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

Func WdxFieldType(ft_num)
    Local s
    Switch ft_num
    Case  0
        s = "ft_nomorefields"
    Case  1
        s = "ft_numeric_32"
    Case  2
        s = "ft_numeric_64"
    Case  3
        s = "ft_numeric_floating"
    Case  4
        s = "ft_date"
    Case  5
        s = "ft_time"
    Case  6
        s = "ft_boolean"
    Case  7
        s = "ft_multiplechoice"
    Case  8
        s = "ft_string"
    Case  9
        s = "ft_fulltext"
    Case  10
        s = "ft_datetime"
    Case  11
        s = "ft_stringw"
    Case  12
        s = "ft_fulltextw"       
    EndSwitch
    Return s
EndFunc
В другом модуле вкладываение начинается после такой строчки:

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

If bkg1 = -1 Then bkg1 = 1*255 + 256*255 + 65536*255
Аватара пользователя
yozhik
Сообщения: 363
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Orion9
Первое поправил — Case..EndSwitch был жадным и блокировал Switch..EndSwitch.

А второе не получается воспроизвести. Если можно, выложите модуль посмотреть, может там не в If..Then дело, а в чём другом.
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik
Да, я давно заметил, что ему именно Case..EndSwitch не "заходит". Взял исправленный .coder, проблема ушла, но частично. Теперь другие функции ниже WdxFieldType вкладываются. Надо бы все модули перетряхнуть, раз уж взялся, но вы пока посмотрите пару моментов.

1) Пример из справки. За DateDiff функции вкладываются:

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

Func DateDiff(DateTime1, DateTime2, Unit)
    Local TS1 = IsInt(DateTime1) ? DateTime1 : ToDateTime(DateTime1)
    Local TS2 = IsInt(DateTime2) ? DateTime2 : ToDateTime(DateTime2)
    Local Diff = (TS1 - TS2) / 10000000
    Switch Unit
        Case "M"
            Return Floor(Diff / 60)
        Case "H"
            Return Floor(Diff / 3600)
        Case "D"
            Return Floor(Diff / 86400)
        Else 
            Return Diff
    EndSwitch
EndFunc
2) Проблема действительно была не в If..Then, а в том, что выше по телу функции есть такое:

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

If lParam = 1 And IsPressed(0x5B) Then
   SwitchColors(1)
   Return
EndIf
Видимо ему не нравится имя функции SwitchColors:

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

RegisterCommand 70051 "SwitchColors"

Func SwitchColors(lParam)

EndFunc
Добавлено спустя 7 минут:

После этой функции тоже вкладываются:
Показать

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

Func CreateUwdxBar(Barname)
    Local i = 0
    Local bar, br2, wdx
    # относительный путь к утилите
    Local uwdx_dir = REL_UWDX
    Local uwdx_exe = "%COMMANDER_PATH%" & uwdx_dir & "uwdx.exe"
    Local uwdx_con = "%%COMMANDER_PATH%%" & uwdx_dir & "uwdx.exe"
    Local uwdx_obj = "%P%N" 
    
    bar = DIR_BARS & barname & ".bar"
    br2 = DIR_BARS & barname & ".br2"
   
    ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%bar%"""
    ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%br2%"""
    
    If FileExist(bar) Then   
       MsgBox("Ошибка удаления " & bar, "uwdx")
       Return 0
    Endif
    
    IniWrite %bar% "Buttonbar" "Buttoncount" "0"
    If ERROR = 1 Then 
       MsgBox("Ошибка создания " & bar, "uwdx")
       Return 0   
    EndIf
      
    While i < 100
       IniRead /R wdx %COMMANDER_INI% "ContentPlugins" %"i" "stop"
       If wdx="stop" Then Break
      
       wdx = StrTrim(StrRight(wdx, StrLen(wdx)-StrPos(wdx, "\", -1)))
       
       IniWrite      %bar% "Buttonbar" %"'Button' & i+1"  %uwdx_exe%
       IniWrite      %bar% "Buttonbar" %"'Menu'   & i+1"  %wdx%   
       IniWrite /EV- %bar% "Buttonbar" %"'Cmd'    & i+1"  "%COMSPEC% /k"
       
       Switch Barname
          Case "Auto_uwdxa"
             IniWrite %bar% "Buttonbar" %"'Param' & i+1"  '"""%uwdx_con%""" /I %wdx% ""%uwdx_obj%""'
          Case "Auto_uwdxe"
             IniWrite %bar% "Buttonbar" %"'Param' & i+1"  '"""%uwdx_con%""" /E /I %wdx% ""%uwdx_obj%""' 
          Else
             IniWrite %bar% "Buttonbar" %"'Param' & i+1"  '"""%uwdx_con%""" /I "%wdx%"'
       EndSwitch
               
       i = i + 1
    Wend
    IniWrite %bar% "Buttonbar" "Buttoncount" %i%
    Return 1
EndFunc
Добавлено спустя 11 минут:

Еще одна от Loopback:
Показать

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

Func FindSelectedAndClear(hMenu, bRight)
    Local nCount = DllCall("GetMenuItemCount", "handle", hMenu)
    If nCount = 0 Then Return 0
   
    Local Result = 0
    Static lpmii = Buffer(AUTORUN_TCARCH = 64 ? 80 : 48)
    lpmii.Zero()
    lpmii.SetNum(0, "uint", lpmii.size, "uint", 1) # MIIM_STATE
    For i = nCount - 1 to 0 Step -1
        DllCall("GetMenuItemInfoW", "handle", hMenu, "uint", i, "bool", 1, "ptr", lpmii.ptr)
        If lpmii.GetNum(12) = 0x8 Then # MFS_CHECKED
            Switch i
                Case 0
                    Result = bRight ? 201 : 101
                Case 1
                    Result = bRight ? 202 : 102
                Case 2
                    Result = bRight ? 200 : 100
                Case 3
                    Result = bRight ? 169 : 69
                Else
                    Result = 70 + i - 7
                    If Result < 100 Then
                        If bRight Then Result += 100
                    Else                       
                        Result += (bRight ? 7030 : 6530) - 100
                    EndIf
            EndSwitch
        EndIf
        DllCall("RemoveMenu", "handle", hMenu, "uint", i, "uint", 0x400)
    Next
    Return Result
EndFunc
Аватара пользователя
yozhik
Сообщения: 363
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Orion9
Путаницу Else..EndSwitch с Else..EndIf пока поборол.

Для разграничения Switch и Switch... пока соорудил костыль. Все последние примеры обрабатываются сейчас корректно. По идее не должно было так произойти, чтобы SwitchColor прокатил вместо Switch, плагин должен проверять разделитель (пробел) справа от Switch. Или я, как обычно, недопонял чего :) Написал пока на форуме AkelPad, поглядим что скажут.
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik
Спасибки ) Вот теперь первые впечатления, что всё нормально.

Панель CodeFold непривычно наполнилась новыми функциями, даже приятно стало перемещаться по коду и в самом окне CodeFold. Но завтра еще буду проверять.
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhic
Проверил все модули. Проблемы с вложением функций больше нет. Теперь если что-то и искать, то только внутри самих функций и скорее всего с другими блоками. Но важно, что при открытии модуля все его функции сейчас видны и доступны для корректных операций в плагине Coder.
Аватара пользователя
yozhik
Сообщения: 363
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Orion9
Добро. Осилили совместными усилиями :) Я ещё жду ответа о работе Coder с разделителями в Folds. Бывает, надо подождать, автор — человек отзывчивый, но занятой.
Amo ergo sum
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik
Да, доведём до совершенства рано или поздно. Я довольно часто пользуюсь, поэтому что будет попадаться на глаза сразу буду сообщать.
AkulaBig
Сообщения: 641
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

yozhik
Смутило, что в версии 0.15.6 появилась надпись в заголовке: This file must be encoded in UTF-16 LE. Я спросонья начал переводить mnu в юникод. Убил ТС. Хотелось-бы, чтобы эта надпись исчезла. Ни к чему она. И так понятно, что файлы кодера должны быть в юникоде. А кому не понятно. они вообще не будут в этот файл заглядывать.
Аватара пользователя
yozhik
Сообщения: 363
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

AkulaBig
Ух, вон как бывает, я бы и не подумал даже.
Я бы лучше заменил на «Coder-file must be encoded...», чтобы исключить двусмысленность. Идёт?

Если честно, совсем убирать как-то душа не лежит :( Потому что если кодировка другая, то AkelPad просто тихо игнорирует файл. Если бы он ругался, тогда ладно. Но он вот именно что тихо, ничего не сообщает, и ломай потом голову почему у тебя подсветка не работает.
Amo ergo sum
AkulaBig
Сообщения: 641
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

yozhik писал(а):если кодировка другая, то AkelPad просто тихо игнорирует файл
Это понятно. Но кто будет делать этот файл в другой кодировке? В поставляемых с AkelPad файлах кодировки нет никаких упоминаний про юникод. И получается разночтение. У Андрея Аверина тоже нет. Получается только у вас есть.
Аватара пользователя
jentoso
Сообщения: 446
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

AkulaBig
Про UTF-16LE было известно ещё давно, но автор так и не указал это в справке
https://akelpad.sourceforge.net/forum/v ... 6LE#p21954
TC 11.58 combo, Windows 11 x64
Аватара пользователя
yozhik
Сообщения: 363
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

jentoso
Вот, значит, проблема есть, не надумана. Хотя в «справке» я это уже указал:
https://github.com/yozhic/AkelPad-coder ... ER.TXT#L12
Вы как считаете, удалить комментарий «Coder-file must be encoded in UTF-16 LE» из coder-файлов или оставить?
Amo ergo sum
Ответить