Autorun
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
Выберите два или более файлов, выполните следующий код, StrReplace не заменил auCR.
Код: Выделить всё
SetHotkeyAction /K:A /H:F1 xxx
Func xxx()
Local ListSel= GetSelectedItems(3, 0)
Local Name = StrPart(ListSel, auCR, 2)
msgbox(Name)
msgbox(StrReplace(Name, auCR, 'aaa'))
EndFunc
Ну, такого еще, насколько мне известно, нетMrak_Tlen писал(а):А Авторан еще не научился вгрызаться в контекстное меню, чтобы там нагородить своих подменю?
https://total.darkhost.ru/wiki/lib/exe/ ... dex_ru.png
У меня уже четыре меню так вызываются в трех областях окна ТС. Причем два из них в заголовке - одно создается из бар-файла, другое - из текста, формируемого в скрипте. И это я еще не брался за развешивание как следует
[cut]Я ответил на ваше ПМ еще несколько дней назад, но вы, наверное, пропустили. Просмотрите, как будет возможность.[/cut]
Доделал наконец фичу, над которой работал больше недели. По-моему, получилось неплохо:

Если коротко: можно прикрепить к подсказке данные из WDX плагинов и консольных утилит, причем WDX можно сочетать и добавлять на лету.
[cut="Подробнее"]--------------------------------------------------
Подсказка в файловых панелях
Добавление информации клавишами-модификаторами
--------------------------------------------------
Ctrl - добавить данные MediaInfo
Ctrl+Shift - добавить данные WDX плагинов
Ctrl+Shift+Alt - добавить данные ExifTool
Ctrl+Shift+Win - добавить данные Accesschk
Ctrl+Win+Alt - добавить данные о правах доступа
Alt - добавить данные кастомных полей
--------------------------------------------------
В некоторых случаях, если комбинация клавиш не срабатывает (или плохо срабатывает), помогает смена порядка при нажатии, например, вместо Ctrl+Shift может заработать Shift+Ctrl. В 64-битной версии Total Commander при вызове подсказки клавиши-модификаторы не работают совсем. Одиночный Alt не работает ни в той, ни в другой версии (проверить работоспособность Alt можно только в экранной клавиатуре). Закрепление комбинаций клавиш хорошо работает в обоих версиях Total Commander.
--------------------------------------------------
Закрепление комбинаций клавиш (Lock)
--------------------------------------------------
CapsLock - закрепить данные MediaInfo
Ctrl+CapsLock - закрепить данные ExifTool
Shift+CapsLock - закрепить данные WDX плагинов
Alt+CapsLock - закрепить данные Accesschk
--------------------------------------------------
Нормальная работа клавиши CapsLock будет нарушена в окне ТС, но не в диалоговых окнах.
Переназначить клавишу CapsLock, как и другие комбинации клавиш, можно в скрипте autorun.cfg.
--------------------------------------------------
Управление параметрами MediaInfo и WDX
--------------------------------------------------
Активная панель: Ctrl+ЛКМ - параметры MediaInfo
Строка состояния: ПКМ - меню параметров WDX
--------------------------------------------------
Параметры MediaInfo можно изменить в скрипте autorun.cfg.
Меню параметров WDX находится в файле WdxHint.cfg, содержимое файла можно редактировать отдельно.
Кроме плагинов указанных в файле WdxHint.cfg, к подсказке можно прикрепить данные любого WDX плагина "на лету" (см. ниже)
-------------------------------------------------------------------
Управление фоном панелей и переключение темы
-------------------------------------------------------------------
Ctrl+Shift+"+" - Повышение тонов
Ctrl+Shift+"-" - Понижение тонов
Ctrl+"+" - Автоповышение тонов
Ctrl+"-" - Автопонижение тонов
ESC - Выход из автоперебора
Alt+"+" - Показ текущих значений фона
Alt+"-" - Показ текущих значений схемы
Alt+Shift+"+" - Повышение одного тона
Alt+Shift+"-" - Понижение одного тона
Alt+Win+ЛКМ - Переключение цветовой схемы
Alt+ЛКМ (Активная) - Переключение сохраненного фона
Alt+ЛКМ (Неактивная) - Переключение предопределенного фона
Alt+Shift+ЛКМ (Активная) - Переключение сохраненного фона (реверс)
-------------------------------------------------------------------
Сохранение фона вызывается командой 70002. По умолчанию фон сохраняется в файле \Bars\Backdrops.bar. Путь и название файла можно изменить в скрипте Backdrop.aucfg. Предопределенные значения фона также меняются в скрипте Backdrop.aucfg. Параметры темы хранятся в файлах Colors[N].ini, где N - значение ключа Instance каждого отдельного файла. Файлы создаются вручную и содержат редирект секций [Colors] и [ColorsDark] основного файла конфигурации ТС. В дополнительной секции [ColorTheme] содержится описание темы и ее номер - ключ Instance, который должен совпадать с номером указанным в имени файла. Предусмотрено переключение между пятью темами. Имя файла текущей темы не должно содержать ее номера N, но он должен быть указан в ключе Instance, как и у остальных файлов Colors[N].ini.
Для настройки параметров темы используется утилита ColorMania или стандартный диалог выбора цвета. Скрипт отслеживает изменения в окне ColorMania (или окне диалога) и применяет значения цвета к элементам текущей темы в реальном времени. В окне ColorMania необходимо выбрать формат цвета "Powerbuilder" (функции скрипта, работающие с повышением и понижением тонов, поддерживают только десятичные значения цвета). Клавиши управления в окне: CTRL - применение цвета, SHIFT - откат значения, ALT - значение по умолчанию, ESC - синхронизация цвета, WIN - значение из буфера.
При нажатии на ALT текущему элементу темы присваивается значение цвета по умолчанию, т.е. -1. Клавиша ESC меняет текущее значение цвета в окне ColorMania на цвет элемента темы до начала отслеживания. Клавиша WIN извлекает значение цвета из буфера и применяет его к текущему элементу (может пригодится при возвращении к первоначальным значениям секции).
Элементы темы выбираются из меню доступного после начала отслеживания. Для запуска отслеживания используется код 70001, клавиши-модификаторы меняют поведение функции при вызове из кнопки:
TOTALCMD#BAR#DATA
70001
%COMMANDER_EXE%
Запустить/Остановить|Отслеживание цвета в буфере| |Ctrl - Понижение тонов|Ctrl+Shift - Повышение тонов|Alt - Вернуть первоначальный|Alt+Win - Вернуть предыдущий| |Shift - Показать значения|Alt+Shift - Скопировать в буфер
70001
----------------------------------------------------------------------------
Код 70040 вызывает смену фона и также может использоваться с модификаторами:
----------------------------------------------------------------------------
TOTALCMD#BAR#DATA
70040
%COMMANDER_EXE%
Смена сохраненного фона|Shift - Обратное направление| |Ctrl - Резервные значения|Alt [Shift] - Параметры задержки| |Win - Перечитать сохраненные|Win+Alt - Автоповышение тонов|Win+Ctrl - Автопонижение тонов
0
70040
----------------------
Плагины WDX
----------------------
Код: 70100
Файл: Plugin.aucfg
----------------------
Кнопка создает меню и файл панели для всех зарегистрированных WDX плагинов, а также проверяет их загрузку. По умолчанию имя файла панели \Bars\Auto_wdx.bar. Работоспособность панели зависит от текущего состояния массива, который заполняется при первом нажатии на кнопку и сохраняется до конца текущей сессии. Последующие вызывы кнопки отображают меню созданное из заполненного массива. Нажатие Ctrl - перечитывает секцию ContentPlugins и создает новый массив (а вместе с ним и панель Auto_wdx.bar), Ctrl+Shift - проверяет плагины на возможность загрузки скриптами Autorun. Имя плагина и код ошибки выводятся в системный отладчик функцией OutputDebugString.
При выборе пункта меню в подсказке отображаются непустые поля плагина. Удерживание Ctrl - все поля плагина. Shift - добавить нумерацию. ВАЖНО: если после выбора плагина нажать Alt, плагин будет приклеплен к подсказке файловых панелей, т.е. данные его полей будут отображаться в подсказке при наведении указателя мыши на объекты с удержанием Ctrl+Shift.
--------------------
Кнопка "Autorun"
--------------------
При наведении на кнопку указателя мыши отображается подсказка о текущей версии плагина Autorun. Удерживание Ctrl - выводит сведения о запущенных потоках и процессах, Shift - о загруженных библиотеках и субплагинах, Alt - о подключаемых файлах и путях.
Одиночный клик - активирует окно просмотрщика DebugView. Двойной клик - запускает DebugView со списом всех доступных переменных Autorun. Двойной клик + Ctrl - запускает DebugView со списом всех переменных окружения. Правый клик мыши отображает меню подключенных модулей. Выбор пункта меню открывает модуль в редакторе. Удерживание Ctrl при выборе пункта меню - переход к файлу модуля в окне ТС. Пункт меню "Настройки" не выполняет никаких действий. [/cut]
А вот вам и сборочка для удобных тестов:
https://www.upload.ee/files/17528244/TOTALCMD.7z.html
[cut]Я назвал ее Total Commander "Сила Autorun 3000" Почему 3000? потому что там 3000 строк на Autorun!
Собрал в нее все самое интересное, что было за последний год в этой теме.) Фактически это чистый ТС и скрипты на Autorun. Некоторые другие плагины и утилиты включены только по необходимости, т.к. они тоже завязаны на скрипты Autorun.
Функция GetSelectedItems разделяет список символами auCRLF, поэтому правильнее будет:yahuu писал(а):Выберите два или более файлов, выполните следующий код, StrReplace не заменил auCR.
Код: Выделить всё
Local Name = StrPart(ListSel, auCRLF, 2)В вашем случае туда попадает не auCR, а auLF, оставшийся при разделении. Проверить это можно заменой символа:
Код: Выделить всё
SetHotkeyAction /K:A /H:F1 xxx
Func xxx()
Local ListSel= GetSelectedItems(3, 0)
Local Name = StrPart(ListSel, auCR, 2)
msgbox(Name)
msgbox(StrReplace(Name, auLF, 'aaa'))
EndFunc
Можете ли вы предоставить функцию LoopListSel()? Обрабатывайте текущие выбранные элементы по одному в цикле. В настоящее время я реализую это следующим образом. Или есть лучший способ?
Код: Выделить всё
Func separateCompress()
Local Count = RequestInfo(11005)
If Count=0 Then SendCommand(2936,-1)
Local Count = RequestInfo(11005), ListSel = GetSelectedItems(3, 0)
For var = 1 To Count
Local Name = StrPart(ListSel, auCRLF, var)
Local FullName = RequestCopyDataInfo("SP") & Name
Local FullNoExtNewName = getFullNoExtName(RequestCopyDataInfo("SP"), Name) & ".7z"
Local sParam = 'a -t7z -mx=5 "' & FullNoExtNewName & '" "' & FullName & '"'
ShellExec %"s7zip" %"sParam"
Next
EndFunc
Func getFullNoExtName(sPath, fileName)
#Если имя папки содержит символ ., TotalCMD будет рассматривать содержимое после . как расширение, поэтому необходимо обрабатывать папки отдельно.
If StrPos(FileGetAttr(sPath & fileName), "D") Then
Return sPath & fileName
Else
If StrPos(fileName, '.') > 0 Then
Return sPath & StrLeft(fileName, StrPos(fileName, '.', -1)-1)
Else
Return sPath & fileName
EndIf
EndIf
EndFunc
@yahuu
My code:
My code:
Код: Выделить всё
# Get selected files in active panel and fill List object
SelectedFiles = List()
selectedList = GetSelectedItems(3,0)
selectedCount = RequestInfo(1004+RequestInfo(1000))
For i=1 To selectedCount
SelectedFiles.add(RequestCopyDataInfo("SP") & StrPart(selectedList, auCRLF, i))
Next
# Releases the List object
Free SelectedFiles
Можно использовать объект List, как уже написали выше. Сейчас, наверное, это самый простой и лучший способ, особенное если использовать его свойство Text:yahuu писал(а):В настоящее время я реализую это следующим образом. Или есть лучший способ?
Код: Выделить всё
SetHotkeyAction /K:A /H:F1 SelectedList
Func SelectedList()
Local aSel = List()
Local sPath = RequestCopyDataInfo("SP"), j, k = 0
aSel.Text = GetSelectedItems(3, 0)
OutputDebugString("Autorun: Selected=" & aSel.Count)
For j = 0 To aSel.Count - 1
OutputDebugString("Autorun: Item[" & j & "]=" & sPath & aSel[j])
If FileExist(sPath & aSel[j]) Then k += 1
Next
ShowHint("Selected: " & aSel.Count & auCRLF & "Processed: " & k)
Free(aSel)
EndFuncAkulaBig
Вот здесь и далее не совсем то обсуждалось, но может, пригодится?
Вот здесь и далее не совсем то обсуждалось, но может, пригодится?
AkulaBig писал(а):Я в инете никого и ничего не боюсь. Тут все смелые
Как я уже говорил, после написания своих плагинов, скрипты на Autorun вам будут казаться семечками.) Поэтому говоря "если вас это не пугает", я имел в виду саму идею, что будет крутиться отдельный поток, проверять что-то каждую секунду в фоне, ресурсы жрать нехилые и мешать нормальной работе ТС
С последними оконными функциями Loopback, конечно, добавил адской мощи плагину. Можно, например, сделать вот так:
[cut]
Код: Выделить всё
Global LANG_THREAD = 1
RegisterCommand 60008 "WatchLangSwitch"
SetHotkeyAction /K:A /H:F1 WatchLangSwitch 0
RunThread ThreadWatchLang
Func WatchLangSwitch(lParam)
If LANG_THREAD > 0 Then
LANG_THREAD = 0
Else
LANG_THREAD = 1
RunThread ThreadWatchLang
EndIf
EndFunc
Func ThreadWatchLang()
Local h = WinFind(AUTORUN_TCHANDLE, "TMyPanel", 5), txt, lng
Static c = 0
If c > 0 Then Return
c += 1
While LANG_THREAD > 0
txt = WinGetText(h)
If DetectLang(txt) <> lng Then ShowHint("Язык: " & DetectLang(txt))
OutputDebugString("Autorun: TMyPanel = " & txt)
lng = DetectLang(txt)
OutputDebugString("Autorun: Language = " & lng)
Sleep(1000)
Wend
c = 0
LANG_THREAD = 0
ShowHint("Поток остановлен")
EndFunc
Func DetectLang(Text)
Local Lang
If StrPos(Text, "файл") Then
Lang = "Русский"
ElseIf StrPos(Text, "file") Then
Lang = "English"
Else
Lang = "???"
EndIf
Return Lang
EndFuncПроверяется строка состояния каждую секунду и смотрится на каком языке написан текст. Делал на скорую руку и без комментариев, но, думаю, вы спокойно разберетесь и переделаете все под себя, если такая фишка действительно будет нужна.
Что касается ресурсов, то у меня сейчас, включая этот, четыре потока крутятся - загрузка ЦПУ от totalcmd.exe в пределах погрешности
[cut="Кнопка"]TOTALCMD#BAR#DATA
60008
%COMMANDER_EXE%
Отслеживать смену языка
60008
[/cut]
Включить или отключить можно также по ALT+F1. По умолчанию при запуске ТС поток включен.
По кнопке или хоткею проблем нет сделать даже без Autorun. Хочется именно переключаться стандартным способом.sa писал(а):AkulaBig
Вот здесь и далее не совсем то обсуждалось, но может, пригодится?
Добавлено спустя 7 минут:
Собственно чудес не бывает. Понятно, что все идет через таймер. Но ведь таже оконная процедура тоже CALLBACK. Да многие функции через таймер. Вроде лишнего не грузят. Вот и хочется проверить, стоит-ли игра свеч.Orion9 писал(а):ресурсы жрать нехилые и мешать нормальной работе ТС![]()
Что и ожидается. Спасибо большое. Мне главное принцип понять, а дальше придумаю, что надо.Orion9 писал(а): Что касается ресурсов, то у меня сейчас, включая этот, четыре потока крутятся - загрузка ЦПУ от totalcmd.exe в пределах погрешности![]()