View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0003286 | Wishes.Plugins | LuaMacro / Macro Browser | public | 2016-08-30 09:40 | 2018-05-13 17:50 |
Reporter | JohnDoe | Assigned To | shmuel | ||
Priority | normal | Severity | feature | Reproducibility | N/A |
Status | closed | Resolution | fixed | ||
Platform | x86 | OS | Windows | OS Version | XP SP3 |
Product Version | 3.0 | ||||
Summary | 0003286: Возможность выполнить скрипт только один раз при загрузке | ||||
Description | Предлагаю реализовать в LuaMacro стандартный способ: - либо после первой загрузки устанавливать какую-то глобальную переменную - либо использовать механизм, аналогичный применяемому сейчас в LuaFar-плагинах, т.е. передавать скрипту дополнительный аргумент при первой загрузке. | ||||
Steps To Reproduce | Сейчас я поступаю примерно так: В _macroinit.lua:
В остальных скриптах:
Такой способ устраивает всем, за исключением того, что он нестандартен, а значит при обмене скриптами будут возникать ньюансы. | ||||
Additional Information | http://forum.farmanager.com/viewtopic.php?p=140189#p140189 P.S. Кроме того, возникает и обратная потребность: выполнять код однократно при выгрузке плагина http://forum.farmanager.com/viewtopic.php?f=15&t=7693&p=140411#p140411 | ||||
Tags | No tags attached. | ||||
|
Об упомянутом в P.S. создан отдельный тикет 0003448 |
|
Перечитал здесь и на форуме, возникла такая мысль: поскольку макросы могут загружаться и перезагружаться из разных мест (согласно документации), то просто глобальная переменная не решит проблему. Или, например, добавили макрофайл и перезагрузили макросы. Для добавленного макрофайла это будет первое исполнение, для остальных - второе или больше. Получается, что нужно хранить данную информацию для каждого макрофайла в отдельности (не то, чтобы это было трудно, вопрос лишь в том, стоит ли игра свеч). |
|
Действительно, простой глобальной переменной не обойтись, как минимум нужна таблица, индексируемая полными именами файлов. Также возможен компромиссный вариант: плагин только создаёт таблицу, а наполняют её уже сами скрипты, по необходимости. Возможно, игра действительно не стоит свеч. |
|
Можно сделать вариант в духе первоначального предложения, поскольку оно достаточное для подавляющего большинства случаев использования макросов. Если же пользователь добавляет "на ходу" код, который должен исполняться 1 раз, то надо перезагрузить Фар. Добавлять глобальную переменную не очень бы хотелось, скорее второй аргумент при исполнении макрофайла. |
|
Что в таком случае будет если фар загружен с ключем /ma, а потом уже выполнена lm:load? Аргументы начинают накапливаться. Может быть стоит вместо этого организовать доступ к потенциальным различным свойствам и методам посредством индексации некоего объекта (который может передаваться параметром, или добавляться в окружение)? Пример свойств: FirstRun, FileName Пример методов: AddExitHandler (если у такого подхода есть шанс, то предлагаю обсудить в отдельном issue) |
|
> Что в таком случае будет если фар загружен с ключем /ma, а потом уже выполнена lm:load? Механизм "однократного исполнения" относится к коду загрузки макросов, а не к их исполнению. Макросы с флагом "RunAfterFARStart" исполняются по сигналу от FAR. В случае /ma Far не посылает этот сигнал плагину LuaMacro. Поэтому мне кажется, что нет связи между этими вещами. > Аргументы начинают накапливаться. Может быть стоит вместо этого организовать доступ > к потенциальным различным свойствам и методам посредством индексации некоего объекта Добавление 2-го параметра за примерно 5.5 лет я не назвал бы накапливанием. Если параметры документированы, то в чём проблема? С объектом было бы элегантнее, да, но это является ломкой существующего API, причём без какой-то выгоды, если не считать "красивость". Я против ломки API. Добавление объекта в окружение не ломает API, но это будет ещё одна новая сущность, плодить которые тоже не хотелось бы. |
|
Не уловил между какими.
Наглядность, расширяемость. Хотя, ради замены двух аргументов может и не стоит, да. |
|
> Не уловил между какими. Между темой данного тикета и запуском Фара с ключом /ma Ваш пример с метатаблицей - не понял о чём он, особенно в контексте нежелательности создания новых сущностей там, где можно обойтись одним простым параметром. |
|
Моя ошибка, имелся ввиду флаг /m Так процитировано же, о том что АПИ не сломается, аргумент можно будет использовать и как объект, и как строку (сейчас же строка) На это я уже ответил, и в целом согласился с вами. |
|
> Моя ошибка, имелся ввиду флаг /m В этом случае первый вызов lm:load будет выполнять роль первой загрузки, и будет исполнен "одноразовый" код. Вроде логичное поведение. Пример с метатаблицей теперь понятен, остроумно, но (субъективно) не хотелось бы. |
|
Согласен |
|
Кстати, по поводу решения с метатаблицей - оно недостаточно функционально. Для far.Show() оно работает, но для других функций, где ожидается тип string (sub, find, match и т.д.), оно работать не будет. Нужно в метатаблицу ещё добавить поле __index. |
|
Например:
|
|
Уже лучше, хотя и не оптимально (при каждой индексации создаётся closure). Нет, это не получится. При сравнении разных типов в Lua 5.1 метаметоды не работают. |
|
Да, пожалуй оптимизировать ваш вариант __index невозможно. Так что можно считать его оптимальным. |
|
LuaMacro build 652. |
|
Работает. Теперь для того чтобы выполнить однократно достаточно обернуть код в |
|
OK, спасибо за сотрудничество. |
Date Modified | Username | Field | Change |
---|---|---|---|
2016-08-30 09:40 | JohnDoe | New Issue | |
2017-07-28 09:55 | JohnDoe | Note Added: 0015499 | |
2017-07-28 11:12 | JohnDoe | Note Edited: 0015499 | |
2017-08-05 09:37 | shmuel | Relationship added | related to 0003448 |
2018-05-08 18:53 | shmuel | Note Added: 0016077 | |
2018-05-10 14:20 | JohnDoe | Note Added: 0016083 | |
2018-05-10 21:09 | shmuel | Note Added: 0016085 | |
2018-05-10 21:10 | shmuel | Note Edited: 0016085 | |
2018-05-11 06:52 | JohnDoe | Note Added: 0016087 | |
2018-05-11 21:24 | shmuel | Note Added: 0016089 | |
2018-05-11 21:25 | shmuel | Note Edited: 0016089 | |
2018-05-12 10:23 | JohnDoe | Note Added: 0016091 | |
2018-05-12 10:35 | shmuel | Note Added: 0016093 | |
2018-05-12 11:17 | JohnDoe | Note Added: 0016095 | |
2018-05-12 11:33 | shmuel | Note Added: 0016098 | |
2018-05-12 11:45 | JohnDoe | Note Added: 0016099 | |
2018-05-12 12:25 | shmuel | Note Added: 0016100 | |
2018-05-12 12:38 | shmuel | Note Edited: 0016100 | |
2018-05-12 15:02 | JohnDoe | Note Added: 0016101 | |
2018-05-12 15:04 | JohnDoe | Note Edited: 0016101 | |
2018-05-12 15:08 | JohnDoe | Note Edited: 0016101 | |
2018-05-12 15:18 | shmuel | Note Added: 0016103 | |
2018-05-12 15:38 | shmuel | Note Edited: 0016103 | |
2018-05-12 18:12 | shmuel | Note Added: 0016105 | |
2018-05-12 22:25 | shmuel | Assigned To | => shmuel |
2018-05-12 22:25 | shmuel | Status | new => feedback |
2018-05-12 22:25 | shmuel | Note Added: 0016106 | |
2018-05-13 17:36 | JohnDoe | Status | feedback => resolved |
2018-05-13 17:43 | JohnDoe | Note Added: 0016107 | |
2018-05-13 17:50 | shmuel | Status | resolved => closed |
2018-05-13 17:50 | shmuel | Resolution | open => fixed |
2018-05-13 17:50 | shmuel | Note Added: 0016108 |