Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 29 additions & 46 deletions log.lua
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
--
-- This library is free software; you can redistribute it and/or modify it
-- under the terms of the MIT license. See LICENSE for details.

-- User configuration section
local default_config = {
-- Name of the plugin. Prepended to log messages
Expand All @@ -25,16 +24,13 @@ local default_config = {

-- Level configuration
modes = {
{ name = "trace", hl = "Comment", },
{ name = "debug", hl = "Comment", },
{ name = "info", hl = "None", },
{ name = "warn", hl = "WarningMsg", },
{ name = "error", hl = "ErrorMsg", },
{ name = "fatal", hl = "ErrorMsg", },
{name = "trace", hl = "Comment"}, {name = "debug", hl = "Comment"},
{name = "info", hl = "None"}, {name = "warn", hl = "WarningMsg"},
{name = "error", hl = "ErrorMsg"}, {name = "fatal", hl = "ErrorMsg"}
},

-- Can limit the number of decimals displayed for floats
float_precision = 0.01,
float_precision = 0.01
}

-- {{{ NO NEED TO CHANGE
Expand All @@ -45,7 +41,8 @@ local unpack = unpack or table.unpack
log.new = function(config, standalone)
config = vim.tbl_deep_extend("force", default_config, config)

local outfile = string.format('%s/%s.log', vim.api.nvim_call_function('stdpath', {'data'}), config.plugin)
local outfile = string.format('%s/%s.log', vim.api.nvim_call_function('stdpath', {'data'}),
config.plugin)

local obj
if standalone then
Expand All @@ -55,9 +52,7 @@ log.new = function(config, standalone)
end

local levels = {}
for i, v in ipairs(config.modes) do
levels[v.name] = i
end
for i, v in ipairs(config.modes) do levels[v.name] = i end

local round = function(x, increment)
increment = increment or 1
Expand All @@ -83,65 +78,53 @@ log.new = function(config, standalone)
return table.concat(t, " ")
end

local console_output = vim.schedule_wrap(function(level_config, info, nameupper, msg)
local console_lineinfo = vim.fn.fnamemodify(info.short_src, ':t') .. ':' .. info.currentline
local console_string = string.format("[%-6s%s] %s: %s", nameupper, os.date("%H:%M:%S"),
console_lineinfo, msg)

if config.highlights and level_config.hl then
vim.cmd(string.format("echohl %s", level_config.hl))
end

local split_console = vim.split(console_string, "\n")
for _, v in ipairs(split_console) do
vim.cmd(string.format([[echom "[%s] %s"]], config.plugin, vim.fn.escape(v, '"')))
end

if config.highlights and level_config.hl then vim.cmd("echohl NONE") end
end)

local log_at_level = function(level, level_config, message_maker, ...)
-- Return early if we're below the config.level
if level < levels[config.level] then
return
end
if level < levels[config.level] then return end
local nameupper = level_config.name:upper()

local msg = message_maker(...)
local info = debug.getinfo(2, "Sl")
local lineinfo = info.short_src .. ":" .. info.currentline

-- Output to console
if config.use_console then
local console_string = string.format(
"[%-6s%s] %s: %s",
nameupper,
os.date("%H:%M:%S"),
lineinfo,
msg
)

if config.highlights and level_config.hl then
vim.cmd(string.format("echohl %s", level_config.hl))
end

local split_console = vim.split(console_string, "\n")
for _, v in ipairs(split_console) do
vim.cmd(string.format([[echom "[%s] %s"]], config.plugin, vim.fn.escape(v, '"')))
end

if config.highlights and level_config.hl then
vim.cmd("echohl NONE")
end
end
if config.use_console then console_output(level_config, info, nameupper, msg) end

-- Output to log file
if config.use_file then
local fp = io.open(outfile, "a")
local str = string.format("[%-6s%s] %s: %s\n",
nameupper, os.date(), lineinfo, msg)
local str = string.format("[%-6s%s] %s: %s\n", nameupper, os.date(), lineinfo, msg)
fp:write(str)
fp:close()
end
end

for i, x in ipairs(config.modes) do
obj[x.name] = function(...)
return log_at_level(i, x, make_string, ...)
end
obj[x.name] = function(...) return log_at_level(i, x, make_string, ...) end

obj[("fmt_%s" ):format(x.name)] = function()
obj[("fmt_%s"):format(x.name)] = function()
return log_at_level(i, x, function(...)
local passed = {...}
local fmt = table.remove(passed, 1)
local inspected = {}
for _, v in ipairs(passed) do
table.insert(inspected, vim.inspect(v))
end
for _, v in ipairs(passed) do table.insert(inspected, vim.inspect(v)) end
return string.format(fmt, unpack(inspected))
end)
end
Expand Down