2.4
- Бинарные строки (непредставимые в utf-8) отображаются с псевдотипом
#string
, в кодировке Ansi. Редактирование тоже поддерживается. - Символы помечающие таблицы и функции теперь настраиваются в options.
- Восстановлена работа jit.util.funcinfo (Shift-F3)
2.3 (2013+)
- При вставке в таблицу, и редактировании значений теперь введённые параметры проверяются на корректность (количество и значение~=nil)
- Функции Lua для работы с массивами не рассчитаны на то, что элементами массива могут быть значиния типа
nil
Теперь это учитывается. (При отображении возвращаемых функциями значений, возможно ещё где-то) - Символ с кодом 0 в ключах и значениях теперь заменяется на '\000'
- Ctrl-I управляет режимом сортировки "различать регистр", начальное значение в опции
ignore_case
. - Не пытаемся работать с upvalues C-функций.
- При просмотре объектов типа
thread
улучшено форматированиеtraceback
. - mf.msgbox -> far.Message (для возможности использования в luafar плагинах)
- Экспериментально: расширение возможностей скрипта, путём добавления новых действий в виде BreakKeys.
le(actions,nil,'addBrKeys')
actions
- таблица - список действий, в том же формате, что и штатнаяbrkeys
(см.)- (вторым параметром обычно передаётся заголовок, в данном случае не имеет смысла)
- 'addBrKeys' команда для импорта.
- Из скрипта убрана работа с локальными переменными функций.
Действия могут быть добавлены отдельным скриптом
se.lua
. - Поддержка cfgscript / ScriptsBrowser http://forum.farmanager.com/viewtopic.php?f=15&t=10418
2.2 (Вт 21 май, 2013 16:18)
Обновление по случаю перехода на luajit.
- [jit|5.2] При запуске функции показывается список её параметров.
Актуально для lua-функций, а C-функции принимают в основном vararg
(все, или по крайней мере большинство).
vararg
отображается тремя точками - [jit|5.2] При просмотре локальных переменных также показывается vararg, в виде таблицы '(*vararg)' Значения доступны для редактирования
- При просмотре локальных переменных также добавляется ещё один псевдоэлемент - сама функция, находящаяся на заданном уровне стека вызовов (т.е. та самая, для которой показываются локальные переменные). Функция помещается в тот же список, что и переменные, как элемент с именем ('(*func: %s)'):format(info.name or '') Мне кажется это не лучший способ представления, если будут идеи получше, то переделаю.
- Новый хоткей - Ctrl-T, переключает режим сортировки (по имени/по типу)
- lua_explorer теперь не спотыкается при обработке 'не очень корректных значений' (Windows XP)
- Пара других исправлений
2.1 (Пт 17 май, 2013 23:19) by John Doe
Изменений накопилось много, не знаю примет ли их EGez, в том или ином виде. На всякий случай выделю в отдельную тему: https://forum.farmanager.com/viewtopic.php?f=60&t=7988
И по случаю релиза небольшое, но важное для меня изменение: при вызове из собственных скриптов можно третьим параметром указать необходимое действие: 'upvalues', 'locals', 'env', 'mt', 'info', 'jitinfo', 'registry'
Lua Explorer „Advanced“
Представляет собой развитие замечательной утилиты Lua Explorer © EGez. Началось всё с небольшой модификации, позволяющей вызывать lua explorer из других скриптов. Но у автора свободного времени не было, а необходимость в изменениях у меня назрела. В частности потому что я начал применять lua explorer в Macro Browser alt. и других скриптах.
Не знаю примет ли EGez мои изменения, поэтому пока форк. В данный момент отличия от оригинального скрипта таковы:
-
Скрипт преобразован в модуль, имя выбрано короткое "le", для быстрого доступа.
-
Изменения
- таблицы и функции в списке помечаются
- Ключи и значения в списке закавычиваются только в случае пустой строки "", или наличии концевых пробелов
- Обрезка чрезмерно длинных ключей
- При просмотре многострочных значений текст больше не центрируется
- Не проглатываются амперсанды в меню, и при просмотре значений (в заголовке) FMENU_AUTOHIGHLIGHT и FMENU_SHOWAMPERSAND почему-то несовместимы, поэтому 'автохоткеи' отключены.
- В ряде мест внедрена защита от ошибок при вызове сторонних функций (через pcall)
- при индексации таблиц с метаметодом
__index
- при редактировании значения, и вставке значения в таблицу (F4, Ins)
- в параметрах при запуске функций (из списка по Enter)
- при индексации таблиц с метаметодом
- Обработка статуса возвращаемого
pcall
при запуске функций. - При ошибке выдаётся соответствующее сообщение.
- При отсутствии метатаблицы по Ctrl-M теперь не показывается message c
nil
-
Новая функциональность
- Копирование в буфер:
- значение: Ctrl-Ins
- ключ: Ctrl-Shift-Ins
- по F3 для объектов типа 'thread' показывается
ebug.traceback
- для функций:
Ctrl-Up: просмотр и редактирование upvalues
(полезно при вызове из собственных скриптов, в отладочных целях)
Ctrl-Down: просмотр и редактирование окружения функций (environment).
Используется
debug.getfenv
, что также позволяет получить окружение объектов типаuserdata
иthread
Alt-F4: открытие модального редактора в месте определения функции - F9:
debug.getregistry
: http://www.lua.ru/doc/3.5.html - при вызове из собственных скриптов доступен просмотр и редактирование локальных переменных Ctrl-1 - Ctrl-9: выбор уровня стека вызовов Переходы по уровням не вложены, т.е. по Esc меню будет сразу закрыто. Для перехода в просмотр глобальной среды можно использовать хоткей Ctrl-G Более наглядный просмотр стека будет позже, отдельной утилитой (пока прототип)
- при вызове из собственных скриптов можно указать необходимое действие: 'upvalues', 'locals', 'env', 'mt', 'info', 'jitinfo', 'registry'
- Копирование в буфер:
Использование:
a. Если вы не планируете вызывать lua explorer из скриптов, то достаточно положить файл
в папку scripts
, и макрос подхватится (Ctrl-Shift-F12)
b. Для использования в качестве модуля скрипт необходимо положить в папку modules
.
Использовать можно так:
-
local lua_explorer = require"le" lua_explorer(sometable,"title")
(title можно не указывать)
-
А файл с макросом для показа _G может выглядеть так
Macro { description = "Lua Explorer"; area="Common"; key="CtrlShiftF12"; action=function() require"le"(_G,'_G') end }
-
Если нужно вызвать из меню пользователя, то можно так:
lua: require"le"(_G,'_G')
c. Кроме того, для быстрого доступа может быть удобно создать глобальную переменную.
Для этого в любом из скриптов в scripts
(но лучше всего в_macroinit.lua
)
надо добавить строчку _G.le = require"le"
Примечание:
Это однозначно удобно для быстрого доступа в процессе отладки, но нежелательно,
чтобы отлаженный скрипт или макрос полагался на глобальную переменную
(это особенно важно при обмене макросами/скриптами)
Подробнее об использовании для отладки собственных скриптов:
-
Макрос из комплекта открывает глобальное окружение, исследуя структуру которого можно почерпнуть массу сведений. Но как уже сказано выше, lua explorer можно использовать для просмотра любой таблицы в ваших собственных скриптах. Для этого нужно указать эту таблицу в качестве аргумента при вызове функции. Второй аргумент - заголовок (опционально). Пример:
lua_explorer(mf.GetMacroCopy(1),'1st loaded macro')
-
Кроме того есть третий (опциональный) параметр, в котором можно сразу указать необходимое действие. (При этом первый два параметра не всегда имеют смысл) Например:
lua_explorer(nil,nil,'locals')
- открыть список текущих локальных переменныхlua_explorer(eval,'eval','upvalues')
- открыть upvalues функции eval
Примечание: если locals и upvalues в заданном контексте нет, то lua_explorer не запустится
Полный список возможных действий: 'upvalues', 'locals', 'env', 'mt', 'info', 'jitinfo', 'registry'
P.S. Свои пожелания уже почти полностью реализовал. Но идеи принимаются. Если кто пожертвует функцию для форматирования больших чисел, то включу (сам не сталкиваюсь).
2.x (Пт 17 май, 2013 11:28) by John Doe
- Уровень стека (для информации о локальных переменных) теперь вычисляется относительно вызова функции 'process' Переходы по уровням больше не вложены
- Хоткей Ctrl-G для открытия таблицы _G
- Отображение амперсандов было исправлено не там где надо
Также выяснилось что флаги меню
FMENU_AUTOHIGHLIGHT
иFMENU_SHOWAMPERSAND
несовместимы. Возможно баг в меню. Отключил пока автохоткеи. - При запуске функций запрос параметров теперь тоже безопасный. (Функция та же что и при редактировании/вставке)
- Обработка статуса возвращаемого pcall при запуске функций. При ошибке выдаётся соответствующее сообщение
- Ключи и значения в списке закавычиваются только в случае пустой строки "", или наличии концевых пробелов
- Обрезка чрезмерно длинных ключей
- Копирование в буфер:
- значение: Ctrl-Ins
- ключ: Ctrl-Shift-Ins
2.x (16 май, 2013 13:47) by John Doe
(forked from 1.1.2)
- Защита (
pcall
) от ошибок при индексации таблиц с метаметодом__index
- Защита от ошибок при редактировании значения, и вставке значения в таблицу (F4, Ins)
- При просмотре многострочных значений текст больше не центрируется
- Не проглатываются амперсанды в меню и при просмотре значений (в заголовке)
- При отсутствии метатаблицы по Ctrl-M теперь не показывается message c
nil
- таблицы и функции в списке помечаются
- по F3 для объектов типа
thread
показываетсяdebug.traceback
- для функций:
- Ctrl-Up: просмотр и редактирование upvalues (полезно при вызове из собственных скриптов, в отладочных целях)
- Ctrl-Down: просмотр и редактирование окружения функций (environment).
Используется debug.getfenv, что также позволяет получить окружение объектов типа
userdata
иthread
- Alt-F4: открытие модального редактора в месте определения функции
- F9: debug.getregistry: http://www.lua.ru/doc/3.5.html
- при вызове из собственных скриптов доступен просмотр и редактирование локальных переменных Ctrl1 - Ctrl9: выбор уровня стека вызовов Более наглядный просмотр стека будет позже, отдельной утилитой (пока прототип)
1.x (Ср 18 сен, 2013 01:11)
Проект остановлен ввиду наступивших (хороших) перемен в жизни и связанным с ними изменением приоритетов. Возобновление работ над проектом в ближайшие годы на мой взгляд к сожалению не предвидится.
В связи с этим публикую код в том состоянии, в котором он пребывает на данный момент.
Помимо того, со спокойной совестью, могу назвать альтернативу, т.к. идея была подхвачена и развивается дальше: Lua Explorer „Advanced“ http://forum.farmanager.com/viewtopic.php?f=60&t=7988
Кто хочет свою альтернативу - дерзайте...
1.1.2 (Вс 03 фев, 2013 06:26)
- Мелкое уточнение
- Косметика
1.1.1 (Пт 14 дек, 2012 21:09)
- Для редактирования квотим строковые значения с помощью
("%q"):format(str)
, а не собственногоaddslashes()
- Другие мелкие изменения
1.1 (Сб 08 дек, 2012 16:54)
- Добавлена возможность редактировать/удалять/добавлять объекты (F4/Del/Ins) (т.к. rawget и rawset не используются, операция может быть пресечена метатаблицами, как это делает Far API)
- ... показать информацию о функции
(
debug.getinfo(...)/jit.util.funcinfo(...)
, F3/Shift+F3) - ... показать/скрыть функции (Ctrl+F)
- ... показать метатаблицу (
debug.getmetatable(...)
, Ctrl+M) - Числовые значения показываются в виде 0xHEX (DEC), для редактирования открываются в виде 0xHEX --[[ DEC ]]
- Строковые значения, при открытии их для редактирования, приводятся в соответствующий вид (addslashes и т.д.)
- Поддерживаются ключи любых типов
- Ключи, так же, как и значения, форматируются соответственно их типу (тип ключа не указан за ненадобностью)
- Добавлена история для полей ввода, идентифицируется по полному имени (пути) объекта.
(напр. аргументы
_G.akey
будут показываться только для него, но не для_G._G.akey
,_G.mf.akey
и т.д.) - ... небольшая помощь по сочетаниям клавиш
- Произведены различные мелкие изменения, оптимизация, рефакторинг
1.0 (Ср 28 ноя, 2012 00:01)
- Пункты меню содержат ключ/имя, тип и текстовую репрезентацию значения.
- Примитивные значения показываются сразу в меню, либо по выбору пункта в 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 в диалоге параметров.
- Параметры интерпретируются как Lua код:
- Свойства фара, которые на самом деле являются функциями и живут в obj.properties, напр. APanel.properties.Empty(), но логически являются элементами obj, в частности APanel.Empty (Lua magic), также поддерживаются и отображаются как свойства, с типами и значениеми.
Вы пишете макросы? Вызывая данный скрипт макросом из макрообласти 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 в диалоге параметров.
- Параметры интерпретируются как Lua код:
- Свойства фара, которые на самом деле являются функциями и живут в obj.properties, напр. APanel.properties.Empty(), но логически являются элементами obj, в частности APanel.Empty (Lua magic), также поддерживаются и отображаются как свойства, с типами и значениеми.
╔════════════════════════════ _G.Editor (17) ═════════════════════════════╗
║ "CurLine" │number │0x00000001 (1) ║
║ "CurPos" │number │0x00000001 (1) ║
║ "DelLine" │function│function: 0x00832988 ║
║ "FileName" │string │"C:\Far3\Profile\Macros\lua_exp»║
║ "GetStr" │function│function: 0x008329a8 ║
║ "InsStr" │function│function: 0x008329c8 ║
║ "Lines" │number │0x000000e8 (232) ║
║ "Pos" │function│function: 0x008329e8 ║
║ "RealPos" │number │0x00000001 (1) ║
║ "Sel" │function│function: 0x00832a08 ║
║ "SelValue" │string │"" ║
║ "Set" │function│function: 0x00832a28 ║
║ "SetStr" │function│function: 0x00832a48 ║
║ "SetTitle" │function│function: 0x00832a68 ║
║ "State" │number │0x00000402 (1026) ║
║ "Undo" │function│function: 0x00832a88 ║
║ "Value" │string │"--[[" ║
╚════════════════════════ F1, F3, F4, Del, Ctrl+M ═════════════════════════╝
Предложения по доработке и изменениям, как говорят немцы, sind herzlich willkommen.
ВНИМАНИЕ: О вызове некоторых функций. (Особенно новичкам читать обязательно!) Т.к. этот скрипт открывает возможность пощупать все потроха, доступные Lua, руками, которые, как нам всем известно, не редко чешутся, возникает некая вероятность, что вы загоните ваш Far в deadlock и вам придется его, беднягу, прибить. Чтобы добиться этого, всего-то можно попробовать запустить какую-нибудь функцию из контекста io, напр. читающую stdin, или же что-нибудь вроде debug.debug().
Более того, в контексте win доступны функции операционной системы, напр. для манипуляции реестром или файловой системой вашего компьютера, там можно много дров наломать.
... посему я должен сказать, что НЕ НЕСУ АБСОЛЮТНО НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ВСЕ ТО, ЧТО ВЫ МОЖЕТЕ ИСПОРТИТЬ И НАТВОРИТЬ С ПОМОЩЬЮ ЭТОГО СКРИПТА, ВЫ ВСЕ ДЕЛАЕТЕ НА СВОЙ СТРАХ И РИСК И НЕ МОЖЕТЕ ОБВИНИТЬ МЕНЯ В ЧЕМ ЛИБО, ДАЖЕ ЕСЛИ ВЫ ЧТО-ТО ИСПОРТИЛИ В РЕЗУЛЬТАТЕ МОЕЙ ОШИБКИ.
Страшно звучит, правда? ;)
Как запускать:
Macro {
area="Common"; key="CtrlAltD"; description="lua_explorer.lua";
action = function()
eval('@%FARPROFILE%\\Macros\\lua_explorer.lua')
end;
}
или же просто:
macro:post @lua_explorer.lua
Удачных экспериментов...