Autorun

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

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

Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

sa писал(а):Решение с добавлением Sleep(250) в начало autorun.cfg может приводить к неприятным последствиям.
Жаль. Казалось, что Доктор Сон прописал надежный костыль :lol:

Надо будет поэксперементировать вот с этим объявлением: Global JustTitle = WinGetText(), VarTitle = JustTitle

Попробовать инициализировать переменные в другом месте и в другое время и посмотреть, что из этого получится.

А тем временем скрипт на Autorun пробил 1000 строк, с чем я вас, Loopback, и поздравляю :lol: Тут даже Гислер бы воскликнул:

[cut]Holy Mother of Auto Love! :mrgreen:[/cut]
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Была уже схожая проблема с открытым списком параметров, но тут обнаружил, что пример из справки
[cut]

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

MyFunc("text")
MyFunc("text", "My title")
 
Func MyFunc(var1, var2 = "Default title")
    MsgBox(var1) # --> text --> text
    MsgBox(var2) # --> Default title --> My title
EndFunc
[/cut]
тоже приводит к сообщению об ошибке "Слишком много актуальных параметров в вызове "MyFunc"", хотя сама функция потом отрабатывает нормально, т.е. как и должна. Жаль. Хотел использовать фичу "Параметр со значением по умолчанию" в одной из функций, но теперь придется, видимо, через глобальную переменную как-то решать.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Жаль.
Всё давно исправлено, надеюсь что версия не за горами.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Похоже, есть еще проблема с функцией Abs. Пример из справки возвращает ноль на числе с дробной частью:

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

MsgBox(Abs(-5))     # --> 5
MsgBox(Abs(1.25))   # --> 1.25
Кстати, навело на мысль, что Autorun нужна функция типа IsInteger, чтобы проверять число, целое оно или нет.

Еще бы хотелось, чтобы ShowPopupMenu могла вызывать внутренние функции Autorun, а не только em_ команды из bar и mnu файлов.

Можно такое реализовать?
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Похоже, есть еще проблема с функцией Abs.
Да, это всё связано с этим багом. Уже исправлено.
Orion9 писал(а):нужна функция типа IsInteger
И не только целое, может и IsNumber понадобиться. Но нужно понимать, что поскольку переменные - строки, такая функция будет сообщать не "тип переменной", а только то, может ли быть данная строка приведена к числу.
Orion9 писал(а):ShowPopupMenu могла вызывать внутренние функции Autorun
В теории и сейчас можно, с помощью костыля в виде регистрации сообщения и отправки тоталу em-команды, которая в свою очередь будет отправлять зарегистрированное сообщение :twisted:

А так что-то наверное можно. Самый простой вариант - сделать какой-то специальный маркер команды, например au_xxxxx (с надеждой, что Гислер в будущем не захочет сделать такой тип команд :D) и использовать его в меню. Но это в определенном смысле ломает совместимость, т.к. при использовании меню в тотале такие пункты будут при нажатии выдавать ошибку. Еще минус, что в отличие от тотала, я не вижу где эти команды могут быть применимы, кроме меню. А ведь придется делать обвес для привязки внутренней функции к этой псевдокоманде (ну или для простоты сделать то что за au_ - именем функции). В общем это нужно обдумать, но идея на первый взгляд выглядит стоящей.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Да, это всё связано с этим багом. Уже исправлено.
Отлично! :D
Loopback писал(а):поскольку переменные - строки, такая функция будет сообщать не "тип переменной", а только то, может ли быть данная строка приведена к числу.
Именно это и нужно, в принципе. Но только чтобы была еще проверка на отсутствие или присутствие дробной части, т.е. чтобы было понятно, целое это число или вещественное.
Loopback писал(а):В теории и сейчас можно, с помощью костыля в виде регистрации сообщения и отправки тоталу em-команды, которая в свою очередь будет отправлять зарегистрированное сообщение :twisted:
Я так и делаю.) Проблем нет, если это всего несколько команд, но когда их больше двух десятков, да еще и однотипных, как-то уже не фонтан. Да и потом, для вызова функций Autorun нужна внешняя утилита, а это еще одно лишнее звено. В итоге, чтобы запустить функцию Autorun из меню, нужно иметь не только саму функцию, но и отдельную em_ команду, прописанную специально для нее в usercmd.ini, а также утилиту TCFS2 или что-то другое, что пошлет сообщение окну ТС. Как-то слишком много посредников тут набирается :lol:
Loopback писал(а):Самый простой вариант - сделать какой-то специальный маркер команды, например au_xxxxx (с надеждой, что Гислер в будущем не захочет сделать такой тип команд :D) и использовать его в меню.
Хороший вариант. А на счет au_xxxxx не беспокойтесь: вряд ли Маэстро захочет на старости лет что-то радикально менять.))
Loopback писал(а):Но это в определенном смысле ломает совместимость, т.к. при использовании меню в тотале такие пункты будут при нажатии выдавать ошибку.
Наверное, тут больше подразумевается, что меню, вызывающее внутренние функции Autorun, будет создаваться в самом скрипте с ключом /F. А если использовать внешние mnu файлы, то действительно можно наткнуться на неприятности, теоретически.
Loopback писал(а):Еще минус, что в отличие от тотала, я не вижу где эти команды могут быть применимы, кроме меню. А ведь придется делать обвес для привязки внутренней функции к этой псевдокоманде (ну или для простоты сделать то что за au_ - именем функции).
Именно так! И логично, и информативно.
Loopback писал(а):В общем это нужно обдумать, но идея на первый взгляд выглядит стоящей.
Еще более стоящая идея, которая давно напрашивается, - чтобы Маэстро хотя бы чуток подсобил и сделал отдельный интерфейс для взаимодействия с Autorun либо какой-то специальной командой, либо посылкой из ТС сообщения самому себе. Причём второй вариант гораздо хуже первого :)
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):И логично, и информативно.
Вроде бы просто и логично, но вылезает проблема - значки. Для внутренних команд они берутся из маппинга *.inc, em-команды сами содержат пути к значкам. А где их брать для условных au-команд?
Orion9 писал(а):чтобы Маэстро хотя бы чуток подсобил и сделал отдельный интерфейс для взаимодействия с Autorun
Очень сомневаюсь, что Кристиан будет заниматься таким взаимодействием со сторонними плагинами или приложениями. Мне кажется, тема сторонней автоматизации для него по интересу где-то ближе к концу списка.

И кстати, что именно подразумевается под таким взаимодействием?
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Вроде бы просто и логично, но вылезает проблема - значки.
Да это не проблема. Можно и без значков обойтись, если на то уж пошло. А если они все-таки будут нужны, то вариант с em_ командой всегда есть в запасе.

Кстати, а если попробовать в параметрах au_ команды в самом mnu перадавать путь к значку, то не получится что-нибудь сделать? Сейчас подобная запись просто игнорируется:

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

txt = txt & 'MENUITEM "Настройки...", au_fConfig, %COMMANDER_PATH%\Icons\File.dll,20' & auCRLF
Loopback писал(а):Мне кажется, тема сторонней автоматизации для него по интересу где-то ближе к концу списка.
Боюсь, не только сторонней :lol:
Loopback писал(а):И кстати, что именно подразумевается под таким взаимодействием?
Точно сказать не могу, тут надо более глубокие системные знания иметь, но если речь идет об избавлении от всех костылей и о прямом вызове функций Autorun из самого ТС, то, думаю, предложенный вами вариант au_ команд вполне может подойти. Другими словами, при создании кнопки в качестве команды указывается не cm_ или em_, а au_ команда с именем функции Autorun. Или в ТС должна быть своя команда, которая будет принимать в качестве параметров имя такой функции. А уж как этот интерфейс будет внутренне устроен и реализован - это другой, чисто технический вопрос. Но понятно, что Autorun должен будет каким-то образом предоставлять список всех доступых к вызову функций, объявленных при загрузке плагина. Другой вопрос, что без самого Гислера такие вопросы не решить и никакие интерфейсы не наладить.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а): Можно и без значков обойтись, если на то уж пошло.
Без значков грустно :)
Orion9 писал(а):Кстати, а если попробовать в параметрах au_ команды в самом mnu перадавать путь к значку
Это один из вариантов, хотя не очень хотелось бы расширять парсер под нестандартный формат. Другой вариант - отдельная функция, задающая привязку au-команды к значку, но это тоже не идеальный вариант, к тому же вызывать ее придется до создания меню. Надо думать дальше. Впрочем, всё равно до следующей беты я это скорее всего не начну.
Orion9 писал(а):Другими словами, при создании кнопки в качестве команды указывается не cm_ или em_, а au_ команда с именем функции Autorun.
Ясно. Но это уже, конечно, из области фантастики. В общем вариант с регистрацией сообщений остаётся основным рабочим вариантом. По-сути единственный его минус - в необходимости дополнительного приложения, отправляющего сообщения.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Это один из вариантов, хотя не очень хотелось бы расширять парсер под нестандартный формат.
Да, могут быть проблемы, особенно если Гислер вдруг решит обрабатывать строку за запятой, т.е. за командой. Это удивительно, как он до сих пор не сделал что-то вроде:

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

MENUITEM "Reboot", cm_Exit, 9
Казалось бы, если есть возможность передавать параметры командам, то логично иметь такую поддержку в MNU файлах. Но даже и такой вариант можно было бы учесть в парсере каким-нибудь дополнительным ключом или маркером.
Loopback писал(а):Другой вариант - отдельная функция, задающая привязку au-команды к значку, но это тоже не идеальный вариант, к тому же вызывать ее придется до создания меню.
С одной стороны, в шапке будут сразу видны объявления и связи всех значков, но с другой стороны, если значков ожидается десятки, то это лишняя груда строк, причем в самом начале скрипта.)
Loopback писал(а):Но это уже, конечно, из области фантастики.
Знаю... Но как красиво было бы! :lol:
Loopback писал(а):В общем вариант с регистрацией сообщений остаётся основным рабочим вариантом. По-сути единственный его минус - в необходимости дополнительного приложения, отправляющего сообщения.
Небольшой минус, согласен. Тем более, что такие утилиты, как TCFS2, не только ведь для отправки сообщений используется, а значит, в любом случае должны быть в наборе.

Более реалистичный случай, если автор ТС сделает собственную команду SendMessage для отправки сообщений окнам, в том числе и своему. Но не похоже, чтобы это было ему интересно. Тема автоматизации там действительно не в приоритетах, судя по всему, а вернее:
[cut]судя последним 30 годам :lol:[/cut]
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а): особенно если Гислер вдруг решит обрабатывать строку за запятой
Это уже не будет иметь значения, он раньше споткнётся на неподдерживаемом идентификаторе.
Orion9 писал(а):Казалось бы, если есть возможность передавать параметры командам, то логично иметь такую поддержку в MNU файлах.
Возможно, не хочет ломать десятилетиями надежно работающий код. А может ему просто никто это не предлагал.
Orion9 писал(а):то это лишняя груда строк, причем в самом начале скрипта
Не обязательно в начале, но где-нибудь до момента вызова меню. Но да, куча строк обеспечена.

Еще есть простой вариант: завести какой-нибудь единый ini-файл с соответствиями. Но этот вариант как-то тоже не очень, появляется еще одна точка редактирования.
Orion9 писал(а):Тем более, что такие утилиты, как TCFS2, не только ведь для отправки сообщений используется, а значит, в любом случае должны быть в наборе.
Как вариант, можно попробовать сделать отправку сообщения через запуск rundll32 (которая гарантированно есть в любой винде) и субплагин Autorun-a, например Runtime. Вызов может выглядеть как-нибудь так:

rundll32.exe <Путь к плагину>Autorun_Runtime.dll,SendMessage "MyMessage 0 0".

Но это по-сути всё равно вызов через внешнее приложение.

Но на самом деле тоже не вижу проблемы иметь утилиту в комплекте, тем более столь несущественного размера.
Orion9 писал(а):Более реалистичный случай, если автор ТС сделает собственную команду SendMessage для отправки сообщений окнам, в том числе и своему.
Да, такого варианта вполне хватило бы, что-то типа cm_SendMessage. Несколько параметров внутренние команды поддерживают.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Возможно, не хочет ломать десятилетиями надежно работающий код. А может ему просто никто это не предлагал.
Может, и есть смыл попросить его рассматривать запятую после команды в MNU как начало параметров или вообще игнорировать все, что идет за запятой (потому что сейчас это приводит к ошибке и недоступности пунктов меню), но я не большой ходок на зарубежный форум челом бить.)
Loopback писал(а):Еще есть простой вариант: завести какой-нибудь единый ini-файл с соответствиями. Но этот вариант как-то тоже не очень, появляется еще одна точка редактирования.
Ни в коем случае! Пусть уж лучше в .aucfg будет куча строк :)
Loopback писал(а): rundll32.exe <Путь к плагину>Autorun_Runtime.dll,SendMessage "MyMessage 0 0".
Интересная идея. Если есть возможность, то, думаю, такой вызов не помешал бы. Хорошо иметь под рукой разные инструменты.
Loopback писал(а):Да, такого варианта вполне хватило бы, что-то типа cm_SendMessage. Несколько параметров внутренние команды поддерживают.
Сделает - хорошо. Не сделает - проживем.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Сделает - хорошо. Не сделает - проживем.
Вряд ли дождёмся, так что сами, всё сами :) Проблему решил, получилось довольно красиво, полностью используя имеющиеся средства ТС.

Можно будет просто использовать свои числовые номера команд, главное, чтобы они не пересекались с имеющимися номерами cm-команд. Вызывать можно точно так же, как обычные cm-команды, как из панели, так и из меню. И для них можно добавить маппинг значков в WCMICONS.INC, как и для внутренних команд. Формат меню менять не нужно.

Осталось дождаться следующей версии, т.к. решил включить этот функционал в основной плагин. Больше пока ничего не добавляю, пишу справку.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Вряд ли дождёмся, так что сами, всё сами :)
Ну как тут не вспомнить золотые слова Зорга:

[cut]If you want something done, do it yourself :mrgreen:
https://www.youtube.com/watch?v=lbDoZTs3NoY&t=67s[/cut]
Loopback писал(а):Можно будет просто использовать свои числовые номера команд, главное, чтобы они не пересекались с имеющимися номерами cm-команд. Вызывать можно точно так же, как обычные cm-команды, как из панели, так и из меню. И для них можно добавить маппинг значков в WCMICONS.INC, как и для внутренних команд. Формат меню менять не нужно.
Звучит немного загадочно, но похоже, вам действительно удалось найти красивое решение. Хотелось бы увидеть примеры такого использования.)
Loopback писал(а):Осталось дождаться следующей версии, т.к. решил включить этот функционал в основной плагин. Больше пока ничего не добавляю, пишу справку.
Отлично! Рад слышать, что процесс вошёл в заключительную стадию. Новая версия плагина давно уже заждалась. Я тоже сегодня постараюсь доделать скрипт на заголовок. Там файл .aucfg уже 1200 строк пробил, но вроде неплохо получилось.)
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Звучит немного загадочно
Никакой мистики. По-сути не сильно отличается от SetMessageAction, но с нюансами. К слову, вариация этой же методики используется в TCFS2Tools.

Сначала в скрипте регистрируем команду c функцией:

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

RegisterCommand 60000 MyCommand

Func MyCommand(lParam)
EndFunc
Зарегистрированное число (в данном случае 60000) - выглядит и действует как обычная внутренняя команда TC, только вызывающая функцию Autorun. Соответственно, практически всё, что применимо к внутренней команде TC, применимо и к этой. Правда, вызов из главного меню пришлось делать на костылях, т.к. при вызове из него тотал, оказывается, не отправляет сообщение с командой.

Единственный здесь момент - не пересекаться с имеющимися командами TC. Его внутренние команды условно располагаются в диапазоне от 1 до 9999. Начиная с 10000 идут автогенерируемые номера команд для пунктов меню с em-командами. Сколько их может быть, не используются ли внутренне еще какие-нибудь диапазоны - неизвестно. Поэтому специально ограничил возможность регистрировать числа < 60000, но это условно, если появится дополнительная информация, можно будет скорректировать.
Ответить