local function getUpValue(f,name)
for i=1,100 do
local k,v = debug.getupvalue (f, i)
if k==name then return v end
end
end
local function getAllUpValues(f)
local all = {}
for i=1,1000 do
local k,v = debug.getupvalue (f, i)
if not k then return all end
all[k] = v
end
end
local function getAllLocals(level)
local all = {}
for i=1,1000 do
local k,v = debug.getlocal (level+1, i)
if not k then return all end
all[k] = v
end
end
local le = require"le"
local F = far.Flags
local bkeys = {
{BreakKey = 'F1', action = function()
far.Message([[
locals : Enter
upvalues : CtrlUp
environment : CtrlDown
goto : CtrlPgUp
: CtrlPgDn
debug.getinfo : F3
debug.getregistry : F9
]],_NAME,nil,"l")
end},
{BreakKey = 'F3', action = function(getinfo)
le(getinfo)
end},
{BreakKey = 'F9', action = function(info)
le(debug.getregistry(), 'debug.getregistry:')
end},
{BreakKey = 'RETURN', action = function(info)
local level = info.level
le(getAllLocals(level+1), 'level: ' .. level)
end},
{BreakKey = 'Ctrl+Numpad2 Ctrl+Down', action = function(getinfo)
local f = getinfo.func
le(getfenv(f), 'getfenv: ' .. tostring(f))
end},
{BreakKey = 'Ctrl+Numpad8 Ctrl+Up', action = function(getinfo)
local f = getinfo.func
le(getAllUpValues(f), 'upvalues: '..tostring(f))
end},
{BreakKey = 'Ctrl+Numpad3 Ctrl+Next', action = function(getinfo)
local FileName = getinfo.source:match"^@(.+)"
if not FileName then far.Show(getinfo.source); return end
local flags = F.EN_NONE
editor.Editor(FileName,nil,nil,nil,nil,nil,flags,getinfo.linedefined)
end},
{BreakKey = 'Ctrl+Numpad9 Ctrl+Prior', action = function(getinfo)
local FileName = getinfo.source:match"^@(.+)"
if not FileName then far.Show(getinfo.source); return end
local flags = F.EF_NONMODAL + F.EF_IMMEDIATERETURN + F.EF_LOCKED + F.EF_DISABLESAVEPOS
editor.Editor(FileName,nil,nil,nil,nil,nil,flags,getinfo.linedefined)
return "break"
end},
}
for i=1,#bkeys do
local t = bkeys[i]
if t.BreakKey:match("%w%s+%w") then
local g = t.BreakKey:gmatch("%S+")
t.BreakKey = g()
for key in g do
local new = {}; for k,v in pairs(t) do new[k]=v end
new.BreakKey = key
table.insert(bkeys,new)
end
end
end
local function showTraceback()
local stack = {}
local str = debug.traceback():match("\n.+"):gmatch("[^\n]+")
for i=1,1000 do
local info = debug.getinfo(i)
if not info then break end
info.level = i
info.text = str()
stack[i] = info
end
stack[1].disable = true
local props = {Title="Traceback of the call stack:";Bottom="Enter: locals | CtrlUp: upvalues | CtrlDown: env | Other: see help (F1)"}
local level,pos
repeat
props.SelectIndex=pos
level,pos = far.Menu(props,stack,bkeys)
if level then
if level.action then
if "break"==level.action(stack[pos]) then break end
end
end
until not level
end
return showTraceback, getUpValue, getAllUpValues, getAllLocals