Page 3 of 3

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Fri 06 Dec, 2019 16:42
by Shmuel

Latest post of the previous page:

LAT wrote: Fri 06 Dec, 2019 16:19 Имхо, стоило бы начать с рассмотрения реальных задач, для которых могут потребоваться такие возможности.
Согласен с вами, не стоит рубить сплеча. Время покажет.

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Fri 06 Dec, 2019 17:09
by citRiks
LAT wrote: Fri 06 Dec, 2019 16:19 стоило бы начать с рассмотрения реальных задач, для которых могут потребоваться такие возможности
Вероятно, прежде всего для беглого обзора сложных и объёмных макросов. Я набросал себе для интереса черновик тестового .
Который, кроме прочего, показывает, что некоторые позиции (action, condition, selected, original) с налёта не берутся.

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Fri 06 Dec, 2019 17:17
by LAT
citRiks wrote: Fri 06 Dec, 2019 17:09
LAT wrote: Fri 06 Dec, 2019 16:19 стоило бы начать с рассмотрения реальных задач, для которых могут потребоваться такие возможности
Вероятно, прежде всего для беглого обзора сложных и объёмных макросов...
А чем уже существующие инструменты обзора/мониторинга макросов не устраивают?
UPD. И зачем для беглого мониторинга возможность изменения полей (кроме key и area)?

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Fri 06 Dec, 2019 18:23
by citRiks
LAT wrote: Fri 06 Dec, 2019 17:17 А чем уже существующие инструменты обзора/мониторинга макросов не устраивают?
Мне нравится форма представления макроса уже в том несовершенном , который получается по результатам работы вышеприведённого тестового макроса. Тем, что всё приведено в целом обзорно. И, я полагаю, имхо, что добавление этой формы в "существующие инструменты обзора/мониторинга" будет к лучшему.
зачем для беглого мониторинга возможность изменения полей (кроме key и area)?
Лично я об этом и не заикался. И, более того, дистанционное, не непосредственное, изменение полей (в т.ч. и key, и area) не нахожу практичным. Ну, разве что, умозрительно могу представить их для оперативной отладки и опробования скриптов.

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Fri 06 Dec, 2019 19:20
by Xerox
citRiks wrote: Fri 06 Dec, 2019 17:09Который, кроме прочего, показывает, что некоторые позиции (action, condition, selected, original) с налёта не берутся.
Не, тогда уж надо так, в теле макроса:

Code: Select all

for k,v in pairs(_mmd) do mf.printconsole(k, " = ", v) end
"_mmd_original" в другом варианте реализации (третий "изящный") [utils.lua] равноценна "_mmd" (без ничего)
Если у вас третий "изящный" вариант, тогда лучше как здесь выше.
там и увидите ваши функции (=action, condition, selected) :) нечитаемые правда.
но! зато ее можно использовать отделно от самого макроса.. если ты уже находишься в макросе.. т.е., создать рекурсивный макрос.. хехе..
или если ее куда нибудь отдельно положить на этапе построения в [utils.lua], то можно ею пользоваться совсем-совсем отдельно.
и так как она будет бежать в том же контексте обьекта макроса, то тогда имеем возможность "дистанционно" управлять макросом, без необходимости его срабатывания на его триггер (клавиатурные, аутостарт, др.)
Я слегка модифицировал ваш тестовый макрос для пущей наглядности:
  1. local l = 41 -- ширина участка поля description в меню выбора макроса
  2.  
  3. -- (при применении key2Process
  4.  
  5. -- (см. key2Process.lua - автор IgorZ https://forum.farmanager.com/viewtopic.php?p=152518#p152518))
  6.  
  7.  
  8.  
  9. Macro { description = "получить макроопределения (Xerox)";
  10.  
  11.     code="Keys(\"Right F4 End Left CtrlShiftLeft CtrlIns Esc ShiftIns\")";
  12.  
  13.     area = "common"; id="7F621267-55A7-4CFE-8A0B-BCEE38DE67B7";
  14.  
  15.     guid="";
  16.  
  17.     selected=true;
  18.  
  19.     lang="";
  20.  
  21.     define="";
  22.  
  23.     flags="";
  24.  
  25.     priority=50;
  26.  
  27.     sortpriority="100";
  28.  
  29.     prefixes="";
  30.  
  31.     filemask="*.*";
  32.  
  33.     callback="";
  34.  
  35.     callbackId="";
  36.  
  37.     group="";
  38.  
  39.     mode="";
  40.  
  41.     key="CtrlAltShiftF12 CtrlAltF12 ShiftF12";
  42.  
  43.     key2="CtrlAltF12";
  44.  
  45.     bdsize=l; --key="CtrlAltF12";  
  46.  
  47.     condition=function() return 1==1 end;
  48.  
  49.     action = function()
  50.  
  51. far.Message(
  52.  
  53. "\n1. description - описание: ".._mmd_description.."\n"..
  54.  
  55. "2. area - области действия: ".._mmd_area.."\n"..
  56.  
  57. "3. id - идентификатор: ".._mmd_id.."\n"..
  58.  
  59. "4. guid - идентификатор: ".._mmd_guid.."\n"..
  60.  
  61. "5. key - ключи макроса: ".._mmd_key.."\n"..
  62.  
  63. "6. sortpriority - приоритет сортировки в меню выбора: ".._mmd_sortpriority.."\n"..
  64.  
  65. "7. priority - приоритет исполнения: ".._mmd_priority.."\n"..
  66.  
  67. "8. flags - флаги: ".._mmd_flags.."\n"..
  68.  
  69. "9. prefixes - префиксы: ".._mmd_prefixes.."\n"..
  70.  
  71. "10. filemask - маски файлов: ".._mmd_filemask.."\n"..
  72.  
  73. "11. key2 - ключ вызова из меню выбора макроса: ".._mmd_key2.."\n"..
  74.  
  75. "11а. bdsize - ширина участка поля description в меню выбора макроса: ".._mmd_bdsize.."\n"..
  76.  
  77. "12. callback: ".._mmd_callback.."\n"..
  78.  
  79. "13. callbackId: ".._mmd_callbackId.."\n"..
  80.  
  81. "14. group: ".._mmd_group.."\n"..
  82.  
  83. "15. lang - язык: ".._mmd_lang.."\n"..
  84.  
  85. "16. mode: ".._mmd_mode.."\n"..
  86.  
  87. "17. define: ".._mmd_define.."\n"..
  88.  
  89. "18. FileName - имя файла: ".._mmd_filename, "Макроописания данного тестового макроса:", nil, "l"
  90.  
  91.     )
  92.  
  93. mf.printconsole("===== full introspection/metadata is here: =====")
  94.  
  95. for k,v in pairs(_mmd) do mf.printconsole(k, " = ", v) end
  96.  
  97. mf.printconsole("===== end of that suff =====")
  98.  
  99.     end
  100.  
  101.     end;
  102.  
  103. }
На выходе получилось:

И тут становится понятным почему у вас не было видно все что функции, потому что это уже не текст а уже сами функии, т.е видим ее адрес а не ее текст.
Выцепить текст конкретной функции в рамках моего подхода, я пока не знаю как
Можно еще впрочем в метадату добавить целиком текст файла из которого загрусился каждый макрос, но это вряд ли нужно, так как path все рано у нас уже есть (_mmd_filename), а разбиения текста на функции все равно не получим

П.С.
Просьба польозваться 3-м "изящным" вариантом, который технически более корректен.
Смотреть результат лучше как я здесь привел пример, с циклом по таблице _ММД

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Fri 06 Dec, 2019 20:19
by Xerox
citRiks wrote: Fri 06 Dec, 2019 18:23 И, я полагаю, имхо, что добавление этой формы в "существующие инструменты обзора/мониторинга" будет к лучшему.
Да. Ничуть не умаляя достоинств уже существующего,
предложенное решение поражает своим изяществом.
Реализация оного сделает ФАР недостижимым для конкурентов,
особенно в области самоописания программных модулей,
и как следствие, более полной автоматизации.

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Sat 07 Dec, 2019 05:11
by citRiks
Xerox wrote: Fri 06 Dec, 2019 19:20 Просьба польозваться 3-м "изящным" вариантом
Да.
Xerox wrote: Fri 06 Dec, 2019 19:20 Смотреть результат лучше как я здесь привел пример, с циклом по таблице _ММД
Результаты вывода в диалог легко копируются по CtrlC, а как Вы снимали вышеприведённый output с консоли? Через AltIns?

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Sat 07 Dec, 2019 11:10
by Xerox
citRiks wrote: Sat 07 Dec, 2019 05:11 Результаты вывода в диалог легко копируются по CtrlC, а как Вы снимали вышеприведённый output с консоли? Через AltIns?
Ой и правда, про Ктл-С нa диалогe я не знал O_o.
Вывод в консоль - да, по Альт-Инс, Ктл-<стрелка> еще там дает шаг в 10 позиций курсора
Знакомы ли вы еще с какими удобными способами?

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Sat 07 Dec, 2019 11:22
by Xerox
В плане других инструментов насчет менеджинга скриптов - значительную помощь оказывает "Менеджер Скриптов Луа" и "Луа Експорер Адвансед".
Их возможности впечатляют.
Я пытался оттуда понять как они берут всю эту метадату, и сломал себе мозги.
Может кто-нибудь подскажет принцип как "Луа Експлорер" выцепляет код макроса и остальное тут?

(здесь на этом диалоге кстати Ктл-С не сработал, скопировал только заголовок.. есть ли еще варианты копирования диалога?)
А хотелось элементарного "самоанализа", для которого надо тащить минимум изменений, минимум ЦПУ, минимум мозгов.
Поэтому и сделан такой вариант, 4 строчки добавлены в utils.lua, и все как на ладони.
В том же месте, в принципе, также просто можно сделать дамппинг загруженного кода, для последующего анализа

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Mon 16 Dec, 2019 10:54
by Xerox
Возможно (я так думаю и довольно уверен), тем же способом можно получить разобранный регексп макроса.
Который тут кто-то очень и давно хотел.
Если будет общественное одобрение и/или согласие включить предложенное изменение в мастер, то попробую доколупать эту тему

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Mon 16 Dec, 2019 14:16
by citRiks
Xerox wrote: Mon 16 Dec, 2019 10:54 тем же способом можно получить разобранный регексп макроса
Это было бы очень полезно! Давно удивляюсь почему в макробраузерах не встречается такого, чтобы ключи, заданные в макросах регекспами, можно было бы посмотреть также и в виде перечисления реальных клавишесочетаний.

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Mon 16 Dec, 2019 16:11
by Xerox
citRiks,
Это типа превращать регекспы обратно в нажатия кнопок?
Та не, тут в соседних темах хотели не это, хотели обьект РегЕкспа, который строится из того что мы задаем строкой регексп-выражения
Из того что мы создаем так, создается обьект регекспа, который типа эффективнее держать живым, чем создавать заново каждый раз из строчки, для чего-то там.
С другой стороны, если мы им (желающим использовать регексп в каком скриптинге) уже даем в метадате строку, то они уж могут из нее создать регексп один раз и пользоваться дальше.
так что я беру обратно вопрос-предложение, то что я имелл ввиду, по сути уже есть и так во мною предложенном.
Ну это если я правильно всех понял, конечно

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Mon 16 Dec, 2019 23:05
by buniak_a_h
citRiks wrote: Mon 16 Dec, 2019 14:16 Давно удивляюсь почему в макробраузерах не встречается такого, чтобы ключи, заданные в макросах регекспами, можно было бы посмотреть также и в виде перечисления реальных клавишесочетаний.
Ну Вы даёте! Вот например регэксп /.*T/i Формально "расширений" бесконечно (т.к. в начале - любое количество любых символов). И даже если ограничить возможными именами клавиш, их будет много. Тут как в электронной подписи: проверить легко, а сформировать (найти варианты подписей, проходящие проверку) - трудно…

Интроспекция макросов/скриптов: получить описание и пр.

Posted: Tue 17 Dec, 2019 13:56
by citRiks
buniak_a_h wrote: Mon 16 Dec, 2019 23:05 Вот например регэксп /.*T/i Формально "расширений" бесконечно (т.к. в начале - любое количество любых символов). И даже если ограничить возможными именами клавиш, их будет много
Разумеется, подобные регекспы тоже применяются. (Например, ключ key="/.*/"; используется в одном из макросов популярного скрипта Автофильтр вместо быстрого поиска). И такой регексп в развёрнутом режиме можно было бы показывать макробраузером как "любой ключ". Но всё же это крайний случай. Большинство регекспов, применяемых в ключах макросов, вполне воспроизводимы в развёрнутом виде.

Кстати, имхо, было бы хорошей манерой наряду с ключами, содержащими регекспы, одновременно помещать в макросы в закомментированном виде те же ключи также и развёрнутыми. Это даёт возможность быстрого поиска макросов, назначенных на одинаковые ключи.