repositories / dotfiles
dotfiles
bugabingas dorkfiles
owned by admin
neovim/lua/std/dbg/init.lua
Raw---Debug logging facade.
---Provides dbg(), dbg.kind(), dbg.toggle(), dbg.get() and user commands.
---All debug output goes to the JSONL file at stdpath('state')/bugabinga_config_debug.jsonl.
local file = require 'std.dbg.file'
local format = require 'std.dbg.format'
local user_command = require 'std.user_command'
local viewer = require 'std.dbg.viewer'
if vim.g.bugabinga_debug_mode == nil then
vim.g.bugabinga_debug_mode = false
end
---Returns whether debug mode is currently enabled.
---@return boolean
local function is_debug_mode()
return vim.g.bugabinga_debug_mode
end
---Toggles debug mode on/off and prints a notification.
local function toggle_debug_mode()
vim.g.bugabinga_debug_mode = not vim.g.bugabinga_debug_mode
vim.notify( 'Toggled debug mode to ' .. tostring( is_debug_mode() ) )
end
---Logs a debug event of the specified kind.
---Writes to the debug JSONL file if debug mode is enabled.
---@param kind_name string DEBUG, TRACE, or ERROR
---@param message string format string with {} or {N} placeholders
---@param ... any values to substitute into the format string
local function print_debug_kind( kind_name, message, ... )
if not is_debug_mode() then
return
end
local now = os.time()
local user_data = { ... }
local message = format( message, user_data )
local filename, function_name, line_number = file.get_context()
local event = {
kind = kind_name,
date = now,
message = message,
data = user_data,
filename = filename,
fn = function_name,
line = line_number,
}
file.write( event, file.get_path() )
end
---Logs a DEBUG event.
---@param _ any ignored (table receiver when called via metatable)
---@param message string format string with {} or {N} placeholders
---@param ... any values to substitute
local function print_debug( _, message, ... )
if not is_debug_mode() then
return
end
print_debug_kind( 'DEBUG', message, ... )
end
---Opens or closes the debug viewer depending on current state.
local function toggle_debug_viewer()
if viewer.is_open() then
viewer.close()
else
viewer.open()
end
end
---Opens the raw JSONL debug file in a normal buffer.
local function open_raw_debug_file()
vim.cmd.edit( file.get_path() )
end
user_command.DbgModeToggle 'Toggle global vim config debug mode.' ( toggle_debug_mode )
user_command.DbgViewToggle 'Open or close the debug event viewer' ( toggle_debug_viewer )
user_command.DbgOpenFile 'Opens the JSON debug file in normal buffer' ( open_raw_debug_file )
user_command.DbgClear 'Clears the JSON debug file' ( file.clear_log )
return setmetatable(
{
kind = print_debug_kind,
toggle = toggle_debug_mode,
get = is_debug_mode,
},
{
__call = print_debug,
__newindex = function ( ... )
error( 'Assignments are not supported for std.dbg.\n' .. vim.inspect( ... ), 2 )
end,
}
)