diff --git a/rc/errors.lua b/rc/errors.lua
index d460495..8da80ff 100644
--- a/rc/errors.lua
+++ b/rc/errors.lua
@@ -15,3 +15,68 @@ do
in_error = false
end)
end
+
+local colors = {
+ header = "#FF004D",
+ count = "#33FF33",
+ index = "#708090",
+ name = "#8F8870",
+}
+
+local function dbg_get(var, depth, indent)
+ local a = ""
+ local text = ""
+ local name = ""
+ local vtype = type(var)
+ local vstring = tostring(var)
+
+ if vtype == "table" or vtype == "userdata" then
+ if vtype == "userdata" then var = getmetatable(var) end
+ -- element count and longest key
+ local count = 0
+ local longest_key = 3
+ for k,v in pairs(var) do
+ count = count + 1
+ longest_key = math.max(#tostring(k), longest_key)
+ end
+ text = text .. vstring .. " #" .. count .. ""
+ -- descend a table
+ if depth > 0 then
+ -- sort keys FIXME: messes up sorting number
+ local sorted = {}
+ for k, v in pairs(var) do table.insert(sorted, { k, v }) end
+ table.sort(sorted, function(a, b) return tostring(a[1]) < tostring(b[1]) end)
+ -- go through elements
+ for _, p in ipairs(sorted) do
+ local key = p[1]; local value = p[2]
+ -- don't descend _M
+ local d; if key ~= "_M" then d = depth - 1 else d = 0 end
+ -- get content and add to output
+ local content = dbg_get(value, d, indent + longest_key + 1)
+ text = text .. '\n' .. string.rep(" ", indent) ..
+ string.format("%-"..longest_key.."s %s",
+ tostring(key), content)
+ end
+ end
+ else
+ if vtype == "tag" or vtype == "client" then
+ name = " [" .. var.name:sub(1,10) .. "]"
+ end
+ text = text .. vstring .. name or ""
+ end
+
+ return text
+end
+
+function dbg(...)
+ local num = table.maxn(arg)
+ local text = "dbg #"..num..""
+ local depth = 2
+
+ for i = 1, num do
+ local desc = dbg_get(arg[i], depth, 3)
+ text = text .. string.format("\n%2d %s", i, desc)
+ end
+
+ naughty.notify{ text = text, timeout = 0, hover_timeout = 0.05, screen = screen.count() }
+end