Autorun

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

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

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

Сообщение Loopback »

Flasher писал(а):Почему проблема-то?
Уже много раз повторял - из-за строк без кавычек. Надо было сразу это безобразие пресекать на корню, еще в прошлой версии, как только появилась возможность выполнения функций. От того, что это справочный пример, меньшей проблемой это не становится. Теперь вот второй день хожу и думаю, что с этой фигней делать. Раз уж появился функциональный синтаксис, нельзя было в нем разрешать такие вольности со строками.
Flasher писал(а):Как это всё понимать?
Выше писал yozhik-у, сейчас не поддерживается функциональный синтаксис тут напрямую, только так, как выше приводил пример. Тут вообще похоже он неприменим будет, т.к. функция с параметрами переданная в качестве параметра в ControlSetMouseAction, будет выполняться один раз при вызове ControlSetMouseAction, поскольку параметры вычисляются при входе в нее. Примерно так, как сейчас в этом примере и произошло.

В общем специфичная получилась запись, она вообще выбивается из всей логики скрипта.
Flasher писал(а): где вместо %LNG% ожидается пустое значения для правильного срабатывания
Так если переменная %LNG% существует и она пустая, то и будет пустое значение. А вот если не существует, вернется само имя переменной, так было и раньше. Что мне и не нравится, т.к. фактически это ошибка пользователя в скрипте.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Flasher писал(а):вообще без шифта стали работать
Ой! Точно. Только заметил: и у меня без шифта стало срабатывать

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

ControlSetMouseAction /L /K:S /B:7 17 CommandExec em_TCRestart
В общем, если указан Ctrl или Shift, то команда срабатывает по простому клику без модификатора. Если указан Alt или больше одного модификатора, то нормально работает.
Последний раз редактировалось yozhik Пт июн 05, 2020 00:19, всего редактировалось 1 раз.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Очередной раз исправил модификаторы, перемудрил я с ними, кажется, всё проще решается. Надеюсь теперь окончательно.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):Уже много раз повторял - из-за строк без кавычек.
Так сам код выполняется. Я и спрашиваю, с чего ты взял, что проблемный, если это не так.
Loopback писал(а):Раз уж появился функциональный синтаксис, нельзя было в нем разрешать такие вольности со строками.
Ну да, ты заявил, что старому синтаксису новый не повредит, что я и отметил как положительный момент, иначе у кучи пользователей создалось бы кучу проблем с необходимостью переписывать свои конфиги.
Loopback писал(а):сейчас не поддерживается функциональный синтаксис тут напрямую, только так, как выше приводил пример.
При чём тут напрямую? Это никак не объясняет, почему приведённые команды стали срабатывать без Alt и почему сообщение появляется при запуске ТС.
Loopback писал(а):Тут вообще похоже он неприменим будет, т.к. функция с параметрами переданная в качестве параметра в ControlSetMouseAction, будет выполняться один раз при вызове ControlSetMouseAction, поскольку параметры вычисляются при входе в нее.
Вообще не понял, как связана неприменимость с указанным повендением. Понятно, что один раз. А сколько же ещё? Тут же нет цикла.
Loopback писал(а):Что мне и не нравится, т.к. фактически это ошибка пользователя в скрипте.
Не согласен. Если переменная не задана, и мы её подставляем, то логично, что она должна вернуть пустое значение. Взять тот же vbs:

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

MsgBox Var
Получим пустую мессагу. Или такой пример:

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

Prog = "Program"
If CreateObject("WScript.Shell").Environment("System")("PROCESSOR_ARCHITECTURE") <> "x86" Then Arch = "x64"
MsgBox Prog & Arch & ".exe"
Последний раз редактировалось Flasher Пт июн 05, 2020 00:41, всего редактировалось 1 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Loopback писал(а):исправил модификаторы
Спасибо, теперь всё хорошо.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):Надеюсь теперь окончательно.
Увы, нет:

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

ControlSetMouseAction /R /K:L 1 ShowPopupMenu ...
ControlSetMouseAction /R /K:L 2 ShowPopupMenu ...
ControlSetMouseAction /L /K:R 23 SendCommand 2944
ControlSetMouseAction /L /K:R 29 SendCommand 2944
Команды выполняются без модификаторов.

По-прежнему мессаги появляется только при старте ТС. Пусть даже запись с %"<>" неактуальна, всё равно логика несвоевременного появления неясна.
С другой стороны, тут всё работает без всяких Eval:

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

SetEnv Manufacturer %"GetCPUInfo('CPUString')"
SetEnv Family %"GetCPUInfo('Family')"
Эта проблема тоже осталась:
Так вот, на русском при нажатии Alt+ПКМ вместо обновления языка стала выполняться смена. И только на английском обновление стало срабатывать.
Пробовал и так, не помогло:

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

ControlSetMouseAction /R /K:A /H:64 0 CommandExec "em_Lang IniRead('~/R', %COMMANDER_INI%, 'Configuration', 'LanguageIni')"
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

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

В общем, я чувствую, что лучше прагмы с переключением поведения ничего не придумать. Два режима: как сейчас, только переменные без %% разрешены не будут. И второй, в котором будут разрешены, но будут обязательны кавычки вокруг строк. Третьего я не вижу.
Flasher писал(а):При чём тут напрямую? Это никак не объясняет, почему приведённые команды стали срабатывать без Alt и почему сообщение появляется при запуске ТС.
Насчет альта не знаю. Посмотрю на месаджбоксах.

Сообщение потому что при запуске команды при старте ТС считывается параметр, который должен быть именем функции. А вместо имени тут вычисляемая строка, которая при считывании выполняется.
Flasher писал(а):Не согласен. Если переменная не задана, и мы её подставляем, то логично, что она должна вернуть пустое значение. Взять тот же vbs:
Не согласен. Я с vbs был знаком очень давно и недолго, но если он на заранее не определенных переменных не возвращает ошибку, то для меня такое поведение дико.
Flasher писал(а):Команды выполняются без модификаторов.
Они меня добьют. Интересно, как они работали, если их явной обработки вообще не было. Явно по чистой случайности.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):но тогда это еще доставляло проблем.
Частица "не" не пропущена?
Loopback писал(а):Третьего я не вижу.
Ну делай так, только оставь текущий вариант умолчательным.
Loopback писал(а):А вместо имени тут вычисляемая строка, которая при считывании выполняется.
Ох, как всё сложно...
Loopback писал(а):то для меня такое поведение дико.
Так на AutoIt без Opt('MustDeclareVars', 1) тоже переменные в ряде случае можно не объявлять. В vbs за обязательность объявления отвечает директива Option Explicit, это нормальная практика.
Loopback писал(а):Интересно, как они работали, если их явной обработки вообще не было.
Не понимаю, о чём ты. Ты меня по ним сам консультировал.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Flasher писал(а):Частица "не" не пропущена?
Пропущена.
Flasher писал(а):Ну делай так, только оставь текущий вариант умолчательным.
Вот это вопрос спорный. Если оставить как есть, то маловероятно, что кто-то (кроме новых пользователей) вообще узнает про более оптимальный вариант. В то время как из всех исправлений может понадобиться изменить несколько неокавыченных строк в условиях. Кому лень это делать - включает прагму.

Не вижу ничего смертельного в некоторых "breaking changes" при переходе на новую мажорную версию. Когда-то это надо делать, иначе хвост неоптимального кода и ошибочных решений так и будет тянуться вечно. К тому же уже сейчас есть четыре изменения, которые могут повлечь неработоспособность старого скрипта, самое критичное - условие старого типа для FileExist/ProcessExist, которого больше нет. Добавится еще одно.

В Autoit такие изменения были регулярно. Одно время в нем очень долго был баг, который позволял вставить разрыв внутри текстовой строки. Когда его исправили, многим пришлось переписывать скрипты, многие возмущались, но это же не повод, чтобы оставить баг неисправленным. До сих пор в Autoit есть опция ExpandEnvStrings, которую ввели где-то в самом начале 3-ей версии и которой уже лет 15 никто не пользуется, а что если бы она была включена по умолчанию?

Ну можно и какой-нибудь AutorunX или Neo сделать, чтобы оправдать критические изменения, но будет ли в этом большой смысл, если старая версия не будет обновляться?
Flasher писал(а):Ох, как всё сложно...
Да не сложно, тут просто сама команда атипичная. В общем подумал, чтобы было понятнее и чтобы естественно ложилось в функциональный синтаксис, надо просто считать, что параметры запускаемой команды/функции - это параметры ControlSetMouseAction, предназначенные для последующей передачи в функцию, имя которой задано перед этими параметрами (да по сути оно и сейчас так и есть). Тогда не будет причины смешивать типы синтаксиса и пытаться воткнуть туда елочку из if-ов или еще что-то непредусмотренное:

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

Только так
ControlSetMouseAction ... SendCommand 123 
Или так
ControlSetMouseAction( ... , SendCommand, 123)
Flasher писал(а):тоже переменные в ряде случае можно не объявлять
Можно не объявлять, но тогда к ним до чтения должно быть присвоено какое-то значение. Иначе - ошибка.

Суть поведения в VBS понятна, но все равно, с точки зрения возможных ошибок, кажется это не совсем правильным. Интересно, кроме VBS есть еще языки, где такое разрешено?
Flasher писал(а):Не понимаю, о чём ты. Ты меня по ним сам консультировал.
Консультировал по тому, как она должна была работать. И что интересно, она работала, но как выясняется, непонятно почему. Похоже по чистой случайности.

Тут проблема в том, что при нажатии, скажем, правой кнопки, заданной в качестве основной, она же возвращалась в качестве модификатора. А состояние кнопок мыши, заданных в качестве модификатора, вообще никак не обрабатывалось. Переписал этот кусок, теперь в список полученных модификаторов основная кнопка не попадает.

Проверил на последних проблемных вариантах, везде работает, но я уже опасаюсь что-то говорить :)

Обновил по той же ссылке.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):маловероятно, что кто-то (кроме новых пользователей) вообще узнает про более оптимальный вариант.
А так они узнают о ней, в основном благодаря получению ошибок, что тоже не айс.
Loopback писал(а):а что если бы она была включена по умолчанию?
Так не была же. А если бы была, то посыпались бы жалобы, само собой. О том и речь.
Loopback писал(а):Ну можно и какой-нибудь AutorunX или Neo сделать
Не стоит.
Loopback писал(а):это параметры ControlSetMouseAction, предназначенные для последующей передачи в функцию, имя которой задано перед этими параметрами
Это заставит плагин не выполнять вычисляемую строку без соотв. жимокликов?
Loopback писал(а): но все равно, с точки зрения возможных ошибок, кажется это не совсем правильным.
Не знаю, что за точка зрения такая, но возможные ошибки всегда можно исправить в процессе отладки. Если переменные не переписываются по многу раз и их крайне мало, то такой подход вполне имеет место быть.
Loopback писал(а):Интересно, кроме VBS есть еще языки, где такое разрешено?
Все диалекты Бэйсика, по всей видимости. vb/vba/pure/real/power и т. д.
А ты можешь хотя бы Dim добавить, чтобы не присваивать пустую строку и не писать Global/Local?
Loopback писал(а):но я уже опасаюсь что-то говорить :)
И правильно. С гл. меню проблема осталась. Также плагин не различает последовательности нажатия модификатора/кнопки. Что я правую зажму, нажав левую, что наоборот, результат аналогичный.

И что там по?:
Loopback писал(а):Короче проехали, верну чтобы не съедался.
Забыл?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Flasher писал(а):А так они узнают о ней, в основном благодаря получению ошибок, что тоже не айс.
Узнают они об этом в основном из описания новой версии, где в таких случаях крупно объявляется о возможных проблемах и путях решения. Кто не читает - сам себе злобный буратино. Уж один раз в 10 лет можно или чуть напрячься, или оставаться на старой версии, благо она работает и добавить в неё уже нечего.
Flasher писал(а):Так не была же. А если бы была, то посыпались бы жалобы, само собой. О том и речь.
Точно уже не помню, это еще на старом форуме было. Либо ее сделали по просьбам тех, кто никак не мог уйти от стереотипов второй версии Autoit, либо этот функционал был добавлен в третью версию, но потом от него решили отказаться и оставить опцию. В любом случае это прямая аналогия. Старый или неудачный функционал может быть оставлен как опция, но не должен быть по умолчанию.
Flasher писал(а):Это заставит плагин не выполнять вычисляемую строку без соотв. жимокликов?
Не, красиво видимо не выйдет. В функциональной записи вложенные параметры, если в них есть выражения, придется записывать строками, иначе они будут вычисляться до передачи в ControlSetMouseAction. В общем что так, что эдак, бредовая запись получилась, не знаю даже, как теперь ее совместить с ФЗ (давай я буду сокращать, надоело писать полностью).

Возможно, лучше оставить ее исключением и не разрешать в ФЗ.
Flasher писал(а):А ты можешь хотя бы Dim добавить, чтобы не присваивать пустую строку и не писать Global/Local?
Могу, но не стану. Чем Global/Local хуже Dim? В чем кайф определять переменную именно в неопределенном диапазоне? В функциях Dim = Local, вне функций - Dim = Global.
Flasher писал(а):С гл. меню проблема осталась.
Если про это "ControlSetMouseAction /R /K:A /H:64 0 ", [s]то это что-то не связанное с последними изменениями в tweaks, майская версия так же не работает.[/s]
В этом коде всё работает, это я у себя накосячил с MsgBox.

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

ControlSetMouseAction /R /K:A /H:64 0 MsgBox 'Alt+ПКМ'
ControlSetMouseAction /R /H:64 0 MsgBox 'ПКМ'
Flasher писал(а):Так вот, на русском при нажатии Alt+ПКМ вместо обновления языка стала выполняться смена. И только на английском обновление стало срабатывать.
Может правильную строку из справки использовать?

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

ControlSetMouseAction /R /H:64 0 CommandExec em_Lang %"IniRead('~/R', %COMMANDER_INI%, Configuration, LanguageIni)" 
Flasher писал(а):Также плагин не различает последовательности нажатия модификатора/кнопки. Что я правую зажму, нажав левую, что наоборот, результат аналогичный.
Если это про этот код:

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

ControlSetMouseAction /L /K:R 23 SendCommand 2944 
ControlSetMouseAction /L /K:R 29 SendCommand 2944
то не подтверждаю, всё различается.
Flasher писал(а):Забыл?
Исправил в невыложенной версии.
Последний раз редактировалось Loopback Пт июн 05, 2020 20:48, всего редактировалось 1 раз.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):Кто не читает - сам себе злобный буратино.
То же самое можно ответить на:
Loopback писал(а):маловероятно, что кто-то (кроме новых пользователей) вообще узнает про более оптимальный вариант.
Loopback писал(а):В любом случае это прямая аналогия.
Ты же написал, что новая опция не была включена по умолчанию.
Loopback писал(а):не знаю даже, как теперь ее совместить с ФЗ (давай я буду сокращать, надоело писать полностью).
Перед сокращением обычно приводят расшифровку. Я без понятия, что за ФЗ. Функциональная/файловая зависимость/запись, федеральный закон, фабрика звёзд? )) Что это?
Loopback писал(а):Чем Global/Local хуже Dim?
Длиннее. В AutoIt же есть. Почему не добавить?
Loopback писал(а):В этом коде всё работает
С мессагой работает, а с исходной командой — нет.
Loopback писал(а):то не подтверждаю, всё различается.
Не знаю. Зажимаю ЛКМ, потом жму ПКМ — и команда срабатывает.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Flasher писал(а):То же самое можно ответить на:
Можно.
Flasher писал(а):Перед сокращением обычно приводят расшифровку.
Функциональная Запись. В противовес Командная Запись.
Flasher писал(а):Длиннее.
Всё. Где смайл facepalm? Слов больше нет :?
Flasher писал(а):В AutoIt же есть.
Лишняя сущность. Пережиток ранних времен. В справке его не рекомендуют к использованию.
Flasher писал(а):С мессагой работает, а с исходной командой — нет.
Ну может потому, что ты свой же пример неправильно записал? Из справки:

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

ControlSetMouseAction /R /H:64 0 CommandExec em_Lang %"IniRead('~/R', %COMMANDER_INI%, Configuration, LanguageIni)"
Всё работает, специально всё ставил и настраивал, чтобы протестировать.
Flasher писал(а):Не знаю. Зажимаю ЛКМ, потом жму ПКМ — и команда срабатывает.
Сочувствую, но повторить на сегодняшней версии не могу.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):Функциональная Запись.
Ясно. В общем, думай, как выбраться из положения.
Loopback писал(а):Где смайл facepalm?
Где-где, в интернете... Изображение
ИзображениеИзображениеИзображениеИзображениеИзображениеИзображениеИзображениеИзображение

Ладно, скажу по-другому: мне так привычней, удобней, сподручней...
Loopback писал(а):В справке его не рекомендуют к использованию.
Где? Тут не вижу.
Loopback писал(а):Ну может потому, что ты свой же пример неправильно записал?
А, по-старому работает. Так, я уже запутался с этими кавычками, не/поддержкой старых записей и т. п. %"<>" останется или нет? Внутри неё кавычки/апострофы для строчных параметров будут нужны или нет?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Flasher писал(а):мне так привычней, удобней, сподручней
Ок.
Flasher писал(а):Где? Тут не вижу.
Тут, раздел Объявление переменных.
Flasher писал(а):Так, я уже запутался с этими кавычками, не/поддержкой старых записей и т. п. %"<>" останется или нет? Внутри неё кавычки/апострофы для строчных параметров будут нужны или нет?
Ну давай подведем краткое резюме.
1. Классический командный синтаксис остается в неизменном виде.
2. В командной записи, если не применяется вычисляемая строка, переменные в командах всегда должны заключены в %%, строки могут быть в кавычках обоих типов или вообще без них.
3. Вычисляемая строка в виде %"<>" остаётся для командного синтаксиса, чтобы выполнять однострочное функциональное выражение и передавать его результат в команду. Применима только и исключительно в командном синтаксисе.
4. Выполнение функциональных выражений будет зависеть от прагмы, соответственно, необходимость кавычек вокруг строк и переменные без %% (в том числе в вычисляемой строке, т.к. это функциональное выражение) регулируется ей.
5. В объявлении переменных и присваивании после = выражения пишутся только в ФЗ.
6. В условиях, циклах, объявлении функций выражения пишутся только в ФЗ.
7. Любая одиночная функция/команда в строке может быть запущена как в КЗ, так и в ФЗ (вопрос в целесообразности).
8. ControlSetMouseAction - исключение, в первую очередь потому, что если в вызываемой команде есть вычисляемая строка, то при командной записи она будет выполняться каждый раз при запуске команды. Достигнуть такого же результата в функциональной записи проблематично. Поэтому, вероятнее всего эта команда будет пригодна только для записи в КЗ.

В общем вот так, всё то, за что я так не люблю AHK. Но теперь я их хотя бы понимаю.
Ответить