Проект остановлен ввиду наступивших (хороших) перемен в жизни и связанным с ними изменением приоритетов. Возобновление работ над проектом в ближайшие годы на мой взгляд к сожалению не предвидится.
В связи с этим публикую код в том состоянии, в котором он пребывает на данный момент.
Помимо того, со спокойной совестью, могу назвать альтернативу, т.к. идея была подхвачена и развивается дальше: Lua Explorer „Advanced“
Кто хочет свою альтернативу - дерзайте...
Изначальное сообщение оставлю прежним:
─────════════════════════─────
Вы пишете макросы? Вызывая данный скрипт макросом из макрообласти Common, можно напр. заранее изучить некоторые свойства диалогов, будь то Id, индекс кнопки OK, значения плагиновых панелей, и т.д. Думаю, это может сильно помочь вам в понимании/ловле жуков.
Вот, писал сначала для себя, но потом решил и со всеми поделиться.
С помощью данного скрипта можно изучать среду Lua в Far manager перемещаясь по структурам в виде системы вложенных меню, элементы которых содержат ключ/имя, тип и значение элементов текущей таблицы.
На данный момент реализованы следующие возможности:
Просмотр, редактирование, удаление и создание новых элементов.
Запуск любой функции с возможностью задать любые параметры.
В качестве параметров, ключей или новых значений можно использовать любой валидный код Lua, будь то константы или существующие в текущем контексте переменные.
История для параметров или редактируемых значений. Для каждой функции/переменной - своя.
Просмотр/редактирование мета-таблиц.
Информация о функциях.
Краткая помощь по клавишам.
Первый релиз:
Пункты меню содержат ключ/имя, тип и текстовую репрезентацию значения.
Примитивные значения показываются сразу в меню, либо по выбору пункта в msgbox(...).
В каждую таблицу можно зайти как в меню.
Menu title показывает полный путь в виде Lua кода. (напр. _G.package.loaded.jit.util, но не x[1].y, а x.1.y, посмотрим, может еще прикручу)
Каждую функцию можно выполнить, со своими параметрами или без них.
Параметры интерпретируются как Lua код: loadstring('return ' .. prompt(...))().
... т.е. могут быть константами типа 25, 0xff, "Lua!" или существующими переменными вроде APanel.Path, любой валидный Lua код!
Функции выполняются в защищенной среде pcall(...). (аналог try-catch)
Статус выполнения и возвращенные значения показываются в виде таблицы, т.е. меню, которое так же можно прошерстить.
(1 = ОК/Ошибка, 2, ... = return values/текст ошибки в случае оной. См. pcall(...))
Выполнение функции можно отменить нажав Cancel/Esc в диалоге параметров.
Свойства фара, которые на самом деле являются функциями и живут в obj.properties, напр. APanel.properties.Empty(), но логически являются элементами obj, в частности APanel.Empty (Lua magic), так же поддерживаются и отображаются как свойства, с типами и значениеми.
Изменения в версии 1.1:
Добавлена возможность редактировать/удалять/добавлять объекты (F4/Del/Ins)
(т.к. rawget и rawset не используются, операция может быть пресечена метатаблицами, как это делает Far API)
... показать информацию о функции (debug.getinfo(...)/jit.util.funcinfo(...), F3/Shift+F3)
Числовые значения показываются в виде 0xHEX (DEC), для редактирования открываются в виде 0xHEX --[[ DEC ]]
Строковые значения, при открытии их для редактирования, приводятся в соответствующий вид (addslashes и т.д.)
Поддерживаются ключи любых типов
Ключи, так же, как и значения, форматируются соответственно их типу (тип ключа не указан за ненадобностью)
Добавлена история для полей ввода, идентифицируется по полному имени (пути) объекта.
(напр. аргументы _G.akey будут показываться только для него, но не для _G._G.akey, _G.mf.akey и т.д.)
... небольшая помощь по сочетаниям клавиш
Произведены различные мелкие изменения, оптимизация, рефакторинг
Изменения в версии 1.1.1:
Для редактирования квотим строковые значения с помщью ("%q"):format(str), а не собственного addslashes()
Предложения по доработке и изменениям, как говорят немцы, sind herzlich willkommen.
ВНИМАНИЕ: О вызове некоторых функций. (Особенно новичкам читать обязательно!)
Т.к. этот скрипт открывает возможность пощупать все потроха, доступные Lua, руками, которые, как нам всем известно, не редко чешутся, возникает некая вероятность, что вы загоните ваш Far в deadlock и вам придется его, беднягу, прибить. Чтобы добиться этого, всего-то можно попробовать запустить какую-нибудь функцию из контекста io, напр. читающую stdin, или же что-нибудь вроде debug.debug().
Более того, в контексте win доступны функции операционной системы, напр. для манипуляции реестром или файловой системой вашего компьютера, там можно много дров наломать.
... посему я должен сказать, что НЕ НЕСУ АБСОЛЮТНО НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ВСЕ ТО, ЧТО ВЫ МОЖЕТЕ ИСПОРТИТЬ И НАТВОРИТЬ С ПОМОЩЬЮ ЭТОГО СКРИПТА, ВЫ ВСЕ ДЕЛАЕТЕ НА СВОЙ СТРАХ И РИСК И НЕ МОЖЕТЕ ОБВИНИТЬ МЕНЯ В ЧЕМ ЛИБО, ДАЖЕ ЕСЛИ ВЫ ЧТО-ТО ИСПОРТИЛИ В РЕЗУЛЬТАТЕ МОЕЙ ОШИБКИ.
EGez
Спасибо, что поделились!
У меня тоже лежит подобная утилита, называется TableView, автор maxdrfl, с моими модификациями. Пока не выкладываю, так как она не позволяет заглянуть в "свойства" (в ту пору макросы ещё были не на Lua, и утилита использовалась только с LuaFAR-плагинами).
EGez, спасибо, хорошая полезная вещь. Не бросайте, если есть пути улучшить
HaRT, да, но панели хороши не всегда. В том же PowerShellFar в отладчике только модальные инструменты применимы, и подход с меню мог бы пригодиться (там, правда, есть альтернатива - редактор-консоль).
Отличная вещь, я не успел доделать свою подобную, но более скромную = простую... У Вас получилось очень удачно!
Есть пожелание(и что я собирался сделать у себя) - редактирование свойств, а не только выполнять функций. (сейчас я обхожусь своим калькулятором, чтобы править/тестировать всё что можно в луа окружении, а не только складывать и умножать ).
SUSim wrote:
[. . .]
Есть пожелание(и что я собирался сделать у себя) - редактирование свойств, а не только выполнять функций. [. . .]
Редактирование свойств я уже и сам наметил следующим шагом, даже представляю себе как это могло бы выглядеть, но, похоже, придется как-то иначе обходиться с фаровскими "свойствами", хотя некоторые надумки есть.
2useven10 wrote:
[. . .]
одно пожелание - хочется прятать/показывать функции (по Ctrl-H или Ctrl-F).
В уже открытом меню выполнение макроса полностью останавливается, т.к. функция Menu.Show(...) блокирует до выбора какого-нибудь пункта. Разве можно в таком случае вообще как-то обрабатывать нажатия клавиш? Или, может быть, параллельно второй макрос запускать?
В описании что-то говорилось о фильтрах, но, похоже, это не совсем то. Судя по всему, скрыть функции, в данном случае просто по типу, можно только во время сборки меню, напр. пропуская все то, что имеет тип 'function'.
Если у кого есть примеры с оброботкой клавиатуры в меню, или какая-нибудь "симуляция" такого поведения, с удовольствием бы посмотрел.
EGez wrote:Редактирование свойств я уже и сам наметил следующим шагом, даже представляю себе как это могло бы выглядеть, но, похоже, придется как-то иначе обходиться с фаровскими "свойствами", хотя некоторые надумки есть.
Здесь, видимо, путаница в терминологии. Все "свойства" (properties) в макро-API - read only, изменить их значения из макроса простым присваиванием - нельзя.
EGez wrote:
В уже открытом меню выполнение макроса полностью останавливается, т.к. функция Menu.Show(...) блокирует до выбора какого-нибудь пункта. Разве можно в таком случае вообще как-то обрабатывать нажатия клавиш? Или, может быть, параллельно второй макрос запускать?
Используйте far.Menu вместо Menu.Show, и обратите внимание на так называемые BreakKeys.
EGez wrote:Если у кого есть примеры с оброботкой клавиатуры в меню, или какая-нибудь "симуляция" такого поведения, с удовольствием бы посмотрел.
Возьмите на github исходники плагина LuaFAR for Editor.
EGez wrote:
[. . .] но, похоже, придется как-то иначе обходиться с фаровскими "свойствами", хотя некоторые надумки есть.
Здесь, видимо, путаница в терминологии. Все "свойства" (properties) в макро-API - read only, изменить их значения из макроса простым присваиванием - нельзя.
[. . .]
Используйте far.Menu вместо Menu.Show, и обратите внимание на так называемые BreakKeys.
[. . .]
Возьмите на github исходники плагина LuaFAR for Editor.
Да, я в курсе, что для Lua это вовсе не свойства даже, говоря "иначе обходиться" имел ввиду пропускать их
В far.Menu заглянул, тут уже интереснее. Исходники тоже гляну, но не сейчас, работа, обед...
Shmuel wrote:[. . .]
Используйте far.Menu вместо Menu.Show, и обратите внимание на так называемые BreakKeys.
[. . .]
Возьмите на github исходники плагина LuaFAR for Editor.
Ого, похоже я раньше только вершину большого айсберга в LuaMacro видел, такая работа достойна уважения...
Вернусь к редактированию:
При более детальном осмотре выяснилось, что в принцыпе изменить можно все.
Неким, исключением, на первый взгляд, являются свойства Far API, установленные функцией SetProperties(...) в ...\LuaMacro\api.lua, но эту защиту можно обойти.
╔═══════════════════════════════════ _G.APanel ═══════════════════════════════════╗
║ Bof string "rawset(...) - против лома нет приема..." ║
║ Bof string "rawset(...) - против лома нет приема..." ║
║ ColumnCount number 0x00000001 (1) ║
║ CurPos number 0x00000003 (3) ║
║ Current string "api.lua" ║
║ DriveType number 0x00000003 (3) ║
Функции же LuaMacro API, или даже целые таблицы, можно перезаписать без всяких препятствий.
К чему это я все?
Сначала я думал как-нибудь блокировать редактирвоание вещей принадлежащих Far- или LuaMacro API, но со временем пришел к выводу, что сама функция редактирования в таком случае полностью теряет свой смысл.
Т.е. либо, делая ее, придежриваться принципа "хозяин - барин", либо не делать вообще.
Кстати, о rawset(...) еще подумаю, возможно будет на выбор... Если есть какие мысли по этому поводу, не стесняемся
-- подменим свойство Far API
rawset(_G.APanel, 'Bof', 'rawset(...) - против лома нет приема...')
-- и вернем назад (т.к. тут оно не перезаписывается, а перекрывается, свойство же лежит в _G.APanel.properties.Bof, обращение к нему только если ключ APanel.Bof не найден)
rawset(_G.APanel, 'Bof', nil)
-- Тут реально заменили
_G.win.CompareString = 'Заменили'
-- И тут, после таких вещей Far придется перезапустить...
_G.win = {}
И да, кстати
HaRT wrote:Эх, подобную бы интроспекцию в виде панельного плагина — чтобы немодально и с закладками.
Пример желаемого, но для .NET — панели PowerShellFar.
rawset(_G.APanel, 'Bof', 'rawset(...) - против лома нет приема...')
А разве кто-то утверждал, что эту защиту нельзя обойти? Можно, конечно, но смысл?
Данные свойства являются read-only по их дизайну. У меня была мысль сделать некоторые свойства read/write (как это, например, в Delphi делается), но не стал, ввиду нехватки времени. Например, при выполнении APanel.Bof=true, курсор панели перемещался бы на начальный элемент.
Shmuel wrote:
А разве кто-то утверждал, что эту защиту нельзя обойти? Можно, конечно, но смысл?
Данные свойства являются read-only по их дизайну. У меня была мысль сделать некоторые свойства read/write (как это, например, в Delphi делается), но не стал, ввиду нехватки времени. Например, при выполнении APanel.Bof=true, курсор панели перемещался бы на начальный элемент.
Я, видимо, не очень удачно выразился.
Речь вовсе не о защите и т.д., просто обычное присваивание таким свойствам значений осознанно заперто, но дело не в этом, я вовсе не ставил под сомнение правильность данного решения и более того, не подвергал его никакой оценке и т.д., я просто констатировал факт размышляя и делясь мыслями по поводу редактирования свойств из Lua Explorer, в частности, о возможном использовании rawset(...) в таких случаях и результате таких манипуляций...