Autorun

Обсуждение только плагинов и утилит для Total Commander.

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

Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

yozhik писал(а):Назрела хотелка.
Она, похоже, уже раньше когда-то назревала, поскольку есть в моем списке с приоритетом "подумать когда-нибудь" :) Но пока не чувствую, что время уже пришло...
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

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

Сообщение yozhik »

sa писал(а):навесить установку языка
Речь про установку языка в TC, если я правильно понял. Ну, при поверхностном взгляде мне кажется можно при помощи новых SetHotkeyAction и SetMessageAction в субплагине Tweaks. На некий хоткей повесить перезапись в wincmd.ini значения ключа LanguageIni и отправку TC команды перечитать wincmd.ini. Но это теоретичсссски, надо разбираться, я пока туда не лез. А в моей фразе «функциональные кнопки (клавиши)» ключевое слово всё же «кнопки», а «клавиши» только постольку, поскольку на них отображается F3/F4/F5 и т.д.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

yozhik писал(а):Речь про установку языка в TC
Нет, языка в системе. Если установлен русский язык, а символы перехода по пунктам меню на английском, то приходится менять язык.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

sa писал(а):Нет, языка в системе.
Язык-то всё равно меняется на уровне приложения.

С помощью вспомогательного скрипта можно сделать. В конфиге Autorun переопределить Ctrl+D:

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

SetHotkeyAction /K:C /H:D SetLangAndOpen

Func SetLangAndOpen()
    ShellExec /WAIT "<path_to_Autoit>\AutoIt3.exe" "<path_to_Script>\setlang.au3"
    SendCommand "cm_DirectoryHotlist"
EndFunc
Скрипт (переключает на английский, для русского строка "0419"):

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

_TCHSetKeyboardLayout("0409", __TCHGetActiveInstance())

Func _TCHSetKeyboardLayout($sLayoutID, $hWnd)
    Local $WM_INPUTLANGCHANGEREQUEST = 0x50
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
    DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, _
                                                "int", $WM_INPUTLANGCHANGEREQUEST, _
                                                "int", 1, _
                                                "int", $ret[0])
EndFunc

Func __TCHGetActiveInstance()
    Local $sInst = EnvGet("COMMANDER_HWND") ; if set by Autorun, preferable
    If ($sInst <> "") And StringIsDigit($sInst) Then Return Hwnd($sInst)
    ; Fallback to "active" window method
    Local $aList = WinList("[CLASS:TTOTAL_CMD]")
    For $i = 1 To $aList[0][0]
        If WinActive($aList[$i][1]) Then Return $aList[$i][1]
    Next
    Return 0
EndFunc
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Loopback писал(а):Язык-то всё равно меняется на уровне приложения.
Понятно, просто у yozhik речь велась про ключ LanguageIni (отвечающий за используемый языковой файл), который мне не нужно менять.
Loopback писал(а):С помощью вспомогательного скрипта можно сделать.
Спасибо, сработало!
Можно теперь обойтись без внешней утилиты (для автоматического переключения языка после Ctrl+D).
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Версия 2.2.7 beta

+ добавлена обновленная английская справка
- функции реестра не работали с именами параметров, содержащими "\"
+ Runtime: добавлена функция IsPressed
- опять исправлена директива LegacyExpression
- исправлена проверка переменной для цикла For
+ добавлена функция RunThread
Аватара пользователя
jentoso
Сообщения: 443
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Loopback писал(а): - функции реестра не работали с именами параметров, содержащими ""
Теперь отрабатывает без ошибки.
TC 11.58 combo, Windows 11 x64
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Loopback
Вот диалог cm_CopySamePanel (Shift+F5/F6):

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

IniRead CRNTLNG "%COMMANDER_INI%" "Configuration" "LanguageIni"
LngRead TREEBTN 5002 "%COMMANDER_PATH%\LANGUAGE\%CRNTLNG%"

If %AUTORUN_TCARCH% = 32 Then
  AddDialog    /W:105 /CENTER:1 "TCheckComboBox"
  AddCondition /TEXT  "TButton" 1 "%TREEBTN%"
  AddControl   /X:106 "TButton" 1
  AddControl   /X:106 "TButton" 2
  AddControl   /X:106 "TButton" 3
  AddControl   /W:109 "TMyComboBox" 1
Else
  AddDialog    /W:105 /CENTER:1 "TCheckComboBox"
  AddCondition /TEXT  "Button" 3 "%TREEBTN%"
  AddControl   /X:106 "Button" 3
  AddControl   /X:106 "Button" 4
  AddControl   /X:106 "Button" 5
  AddControl   /W:108 "LCLComboBox" 1
EndIf
В 32бит всё чётко работает, а в 64бит ModifyDialogs не может поменять ширину LCLComboBox. А у MVV его Autorun_FixWindows.dll меняет ширину этого комбобокса! Может можно что-нибудь «подкрутить»? Или смириться с тем что под 64бит сей комбобокс несгибаем?
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

yozhik писал(а): Или смириться с тем что под 64бит сей комбобокс несгибаем?
Увы, в данной реализации да. В том плагине в целом используется другой метод и, скорее всего, дополнительная поддержка именно этого контрола, позволяющая снять ограничения на изменение ширины.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Команда SetHotkeyAction: у меня комбинации с модификатором Alt почему-то не работают. Пробовал и левую, и правую клавишу.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

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

Сообщение yozhik »

Loopback
Пара замеченных очепяток в справке:

глава RegDelete

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

RegDelete [\K] <ключ> [<параметр>]
слэш в переключателе надо бы перевернуть

глава While...Wend

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

While var > 0
  MsgBox(var) # --> 3 --> 2 --> 1
  var = var - 1
Next
вместо Next надо бы WEnd
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

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

Сообщение yozhik »

Loopback
Вы AkelPad пользуетесь? Я сделал для него подсветку синтаксиса autorun.cfg.

------

Партия замеченных опечаток и недоумений:

В описании CommandExec
Описание гласит:
CommandExec писал(а):Выполнить пользовательскую команду em_* или установить в панелях заданные пути.
При этом в примерах видим выполнение не только пользовательских команд:

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

# открывает диалог настроек
CommandExec cm_Config
и это работает. Хорошо, но чем тогда CommandExec отличается от SendCommand? Только тем, что во 2й внутренние команды TC можно передавать числами? А литерально в обеих — не создаст ли это путаницы? Далее читаем:
CommandExec писал(а):Параметры отправки внутренней команды
и при этом в последующей таблице сведения только о пользовательских em_ командах TC. В русской справке TC эти термины не пересекаются: внутренняя/встроенная — только о cm_, а пользовательская — только о em_.

В описании RunThread

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

RunThread <funcname> [<param1> [.. <paramN>]
RunThread(<funcname> [, <param1> [, .. <paramN>]]
В 1й строке не хватает закрывающей ], во 2й закрывающей )

В описаниях строчных ф-ций намёк на то, что вместо casesense требуется подставлять boolean есть только в StrReplace. Может в др., там где casesense используется, тоже стоит добавить?

В описании StrPart

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

StrPart(<str>, <delim>, <index> [, <casesense>]
Не хватает закрывающей ).

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

sDay = StrPart("Понедельник|Вторник|Среда|Четверг|Пятница|Суббота|Воскресенье" "|", nDay)
Не хватает запятой перед delim.

------

Теперь внимание: очень сильная хотелка. Я давно уже её вынашиваю, и вот настало исполнение времён. Пожалуйста!
Дело в том, что у известного хорошего плагина TWinKey есть два существенных недостатка:
  1. он заброшенный, и с новыми версиями TC всё больше и больше подглючивает;
  2. если TC видит, что он подключен, то блокирует собственную раскраску табов, даже если в TWinKey она не используется.
Поэтому, без лишних слов, вот бы часть самых полезных избранных ф-ций из TWinKey реализовать в субплагинах Autorun. И самой первой сделать эту:
[cut="Специальная обработка клавиши Esc"]Включение этой опции позволяет, максимально сохраняя обычную функциональность клавиши Esc, использовать её также как простой и удобный способ снять и/или восстановить выделение в активной файловой панели.
В Total Commander полное снятие выделения (как с папок, так и с файлов независимо от настроек) выполняется командой cm_ClearAll (клавиатурный стандарт Ctrl+Num-), а восстановление выделения, снятого, например, после выполнения файловой операции — командой cm_RestoreSelection (клавиатурный стандарт Num/). Клавиша же Esc обычно применяется в главном окне TC в совершенно иных целях:
  • для очистки командной строки без перехода в неё (с сохранением фокуса в файловой панели);
  • для скрытия диалога быстрой фильтрации (при этом фильтр останется активным), а при повторном нажатии — для сброса фильтрации;
  • для закрытия диалога быстрого поиска (пустого или с отключённой быстрой фильтрацией).
После включения опции алгоритм применения клавиши Esc будет следующим:
  • Если фокус находится не в файловой панели, то Esc работает обычным образом (закрывает диалоги, очищает командную строку и пр.).
  • Если в текущей файловой панели есть выделенные папки/файлы (в том числе и при включённом быстром фильтре), то нажатие Esc вызывает команду cm_ClearAll, снимающую всё выделение.
  • Если в текущей файловой панели нет выделения, а Esc нажимается в таком состоянии первый раз, то клавиша работает обычным образом (в зависимости от ситуации может, например, сбросить быстрый фильтр или очистить командную строку).
  • Если при отсутствии выделения в файловой панели Esc нажимается второй раз, то вызывается команда cm_RestoreSelection и восстанавливается последнее снятое выделение, если таковое имелось в данном каталоге.
  • Далее и вплоть до использования любой другой клавиши Esc будет циклически снимать/восстанавливать в данном каталоге сохранённое выделение.
[/cut]
Она могла бы хорошо поместиться среди ф-ций Tweaks. Мне кажется, что Вам на то, чтобы её сделать, всего несколько минут понадобится. А я бы тогда отключил TWinkey, из-за этой ф-ции его держу преимущественно. Там, конечно, много ещё других хороших, но без них прожить можно, а эту я по нескольку раз на дню использую, привык-с даже.
Ответить